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

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'))

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


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


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


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'

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))  

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'


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

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'

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.


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:


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

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


1

Acabo de usar con éxito:

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

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'


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")

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.