Conversión de cadena de marca de tiempo de Unix a fecha legible

826

Tengo una cadena que representa una marca de tiempo de Unix (es decir, "1284101485") en Python, y me gustaría convertirla en una fecha legible. Cuando uso time.strftime, obtengo un TypeError:

>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str
VeryNewToPython
fuente
1
enlace a la pregunta para volver a convertir también: stackoverflow.com/q/19801727/3273031
fangoso

Respuestas:

1210

Usar datetimemódulo:

from datetime import datetime
ts = int("1284101485")

# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
Michał Niklas
fuente
131
.fromtimestamp()podría fallar para fechas pasadas si una zona horaria local tuviera un desplazamiento utc diferente. Necesita una base de datos histórica de zonas horarias como la proporcionada por el pytzmódulo (o su sistema operativo). O simplemente trabaje en UTC y úselo .utcfromtimestamp().
jfs el
99
@JFSebastian Has mencionado que esto podría fallar en un par de comentarios, ¿podrías explicar por qué fallaría en fechas u horas pasadas? (A juzgar por los votos a favor, muchas personas están de acuerdo con usted y ven esto como sencillo) ¿Seguramente alguna marca de tiempo Unix tiene una fecha / hora equivalente simple?
davidhood2
3
@ davidhood2 tome un sistema donde python no tenga acceso a la base de datos tz (Windows), configure su zona horaria local en una zona horaria que haya tenido un desplazamiento UTC diferente en el pasado (por ejemplo, Europa / Moscú), llame desde timestamp () con marcas de tiempo del pasado (2011-). Compare los resultados con los valores calculados usando pytz. Si no está claro; haga una pregunta por separado sobre el desbordamiento de pila.
jfs
3
@ davidhood2: publiqué mi propia respuesta que demuestra la pytzsolución .
jfs
66
Un punto de importación es que esto lleva una marca de tiempo en segundos desde la época; si tienes milisegundos, debes dividir entre 1000 como acabo de descubrir.
wordsforthewise
246
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

Tomado de http://seehuhn.de/pages/pdate

Daniel
fuente
145

La respuesta más votada sugiere usar fromtimestamp, que es propenso a errores ya que usa la zona horaria local. Para evitar problemas, un mejor enfoque es usar UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

Donde posix_time es el tiempo de época de Posix que desea convertir

rkachach
fuente
2
import datetime, pytz datetime.datetime (1990, 1, 1, tzinfo = pytz.utc)
y.selivonchyk
76
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'
John La Rooy
fuente
10
time.ctime()y time.localtime()podría fallar para fechas pasadas si una zona horaria local tuviera un desplazamiento utc diferente. Necesita una base de datos histórica de zonas horarias como la proporcionada por el pytzmódulo (o su sistema operativo). O simplemente trabaje en UTC y úselo time.gmtime(). datetimepodría proporcionar un rango de fechas más amplio, por lo que datetime.utcfromtimestamp()podría usarse en lugar de timefunciones.
jfs el
66

Hay dos partes:

  1. Convierta la marca de tiempo de Unix ("segundos desde época") a la hora local
  2. Mostrar la hora local en el formato deseado.

Una forma portátil de obtener la hora local que funciona incluso si la zona horaria local tenía un desplazamiento utc diferente en el pasado y python no tiene acceso a la base de datos tz es usar una pytzzona horaria:

#!/usr/bin/env python
from datetime import datetime
import tzlocal  # $ pip install tzlocal

unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)

Para mostrarlo, puede usar cualquier formato de hora que sea compatible con su sistema, por ejemplo:

print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y"))  # print date in your format

Si no necesita una hora local, para obtener una hora UTC legible en su lugar:

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))

Si no le importan los problemas de zona horaria que podrían afectar la fecha de devolución o si python tiene acceso a la base de datos tz en su sistema:

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

En Python 3, puede obtener una fecha y hora con reconocimiento de zona horaria utilizando solo stdlib (el desplazamiento UTC puede ser incorrecto si python no tiene acceso a la base de datos tz en su sistema, por ejemplo, en Windows):

#!/usr/bin/env python3
from datetime import datetime, timezone

utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))

Las funciones del timemódulo son envoltorios delgados alrededor de la API C correspondiente y, por lo tanto, pueden ser menos portátiles que los datetimemétodos correspondientes; de lo contrario, también podría usarlos:

#!/usr/bin/env python
import time

unix_timestamp  = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) 
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))  
jfs
fuente
Debería ser la respuesta más votada si le importa la hora local.
azzamsa
36

Para una marca de tiempo legible por humanos de una marca de tiempo UNIX, he usado esto en scripts antes:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

Salida:

'26 de diciembre de 2012'

Jared Burrows
fuente
25

Puedes convertir la hora actual así

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

Para convertir una fecha en cadena a diferentes formatos.

import datetime,time

def createDateObject(str_date,strFormat="%Y-%m-%d"):    
    timeStamp = time.mktime(time.strptime(str_date,strFormat))
    return datetime.datetime.fromtimestamp(timeStamp)

def FormatDate(objectDate,strFormat="%Y-%m-%d"):
    return objectDate.strftime(strFormat)

Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')

Output 03-03-2013
Mella
fuente
24

Además de usar el paquete de hora / fecha y hora , los pandas también se pueden usar para resolver el mismo problema. Así es como podemos usar los pandas para convertir la marca de tiempo en fecha legible :

Las marcas de tiempo pueden estar en dos formatos:

  1. 13 dígitos (milisegundos): para convertir milisegundos hasta la fecha, use:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 dígitos (segundos): para convertir segundos a la fecha, use:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'
shubham
fuente
Parece otra victoria para los pandas: el módulo es fantástico en todo
Vaidøtas Ivøška
21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Obtenga la fecha legible de la marca de tiempo con la hora también, también puede cambiar el formato de la fecha.

Rishabh Jhalani
fuente
55
¿Qué agrega esta respuesta a esta respuesta?
kocica
1
Agregue una advertencia relacionada con el problema de la suposición de zona horaria local. Las mejores prácticas en programación son almacenar marcas de tiempo como horas UTC en lugar de marcas de tiempo locales. Pero este ejemplo anterior devolverá la hora incorrecta si la zona horaria local no es UTC.
Timothy C. Quinn
21

En Python 3.6+:

import datetime

timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")

Salida:

2020-01-15 19:51:41

Explicación:

Aplazamiento de pago
fuente
Gran respuesta, pero si mostró cómo podría guardar la fecha en una cadena, y no solo imprimirla: value.strftime ('% Y-% m-% d% H:% M:% S')
bjornasm
6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
itsaruns
fuente
6

Otra forma en que esto se puede hacer usando gmtime y la función de formato;

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

Salida: 2018-10-4 11:57:44

h3xus
fuente
1

Acabo de usar con éxito:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
nimmy
fuente
0

un revestimiento rápido y sucio:

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

'2013-5-5-1-9-43'

eqzx
fuente
3
O de manera más concisa: '-'. Join (map (str, datetime.datetime.now (). Timetuple () [: 6]))
Jelle Zijlstra
2
@JelleZijlstra Eh, prefiero la expresión del generador sobre el mapa.
cruza
44
¿Qué tipo de formato de fecha es '2013-5-5-1-9-43'? Nunca he visto este formato en ninguna parte como una representación válida de una fecha / hora.
madoki
¿Puedes explicar qué califica esto como una representación inválida @madoki? ¿quieres decir no estándar? La principal ventaja que tiene sobre la mayoría de las otras respuestas es la capacidad de incluirlo en una ruta de archivo o directorio, ya que los espacios y los dos puntos no están en el conjunto de caracteres de directorio estándar de Unix. ver, por ejemplo, stackoverflow.com/a/458001/209246
eqzx
0

Puede usar easy_date para facilitarlo:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
Raphael Amoedo
fuente
55
Cada programación tiene sus propios convertidores de fecha y hora. Uno nunca debería tener que usar mods / frameworks para esto
JosFabre
strptimey strftimeno es intuitivo ... E incluso no es legible ... Pero entiendo y respeto tu opinión
Raphael Amoedo
44
Que uno "nunca tenga que usar" está mal. Depende del idioma y la calidad de las bibliotecas incorporadas. Javascript tiene moments.js y Java tuvo tiempo de Joda, que son más populares que las respectivas utilidades de conversión de fecha y hora incorporadas (tanto que el tiempo de Joda más tarde influyó en las bibliotecas estándar actualizadas de Java 8). Dicho esto, a menos que la pregunta requiera buenas bibliotecas de terceros, es preferible dar una respuesta basada en la biblioteca estándar.
Hejazzman
Estoy corregido @NikosVentouras. Acabo de tener el problema "La fecha JS en IE se comporta de manera diferente" por primera vez. Así que terminé usando moment.js
JosFabre