long - string to datetime python
Convertir la cadena de fecha y hora de Unix en una fecha legible (15)
¿Miraste el paquete datetime? Creo que tiene un método fromUnixTimestamp.
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
Además de usar el paquete time / datetime , los pandas también se pueden usar para resolver el mismo problema. A continuación se muestra cómo podemos usar pandas para convertir la marca de tiempo en una fecha legible :
Las marcas de tiempo pueden estar en dos formatos:
13 dígitos (milisegundos): para convertir milisegundos a la fecha, use:
import pandas result_ms=pandas.to_datetime(''1493530261000'',unit=''ms'') str(result_ms) Output: ''2017-04-30 05:31:01''
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''
Existe una forma interesante de no tener que preocuparse por las zonas horarias, utc, etc. Simplemente convierta la cadena al formato de fecha de Excel, y luego a una fecha / hora legible:
import datetime
def xldate_to_datetime(xldate):
temp = datetime.datetime(1899, 12, 30)
delta = datetime.timedelta(days=xldate)
return temp+delta
ts = "1284101485"
tsxl = ((int(ts)/60)/60)/24 + 25569
readabledate = xldate_to_datetime(tsxl)
print(readabledate)
Hay dos partes:
- Convierta la marca de tiempo de Unix ("segundos desde la época") a la hora local
- Muestra 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 pytz
horaria pytz
:
#!/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:
utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))
Si no te preocupan los problemas de la zona horaria que pueden afectar la fecha en que se devuelve o si Python tiene acceso a la base de datos tz en tu sistema:
local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))
En Python 3, podría obtener una fecha y hora que tenga en cuenta la 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 módulo de time
son envolturas finas alrededor de la API de C correspondiente y, por lo tanto, pueden ser menos portátiles que los métodos de datetime
y datetime
correspondientes, de lo contrario, también podría usarlas:
#!/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))
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 utilizar UTC:
datetime.datetime.utcfromtimestamp(posix_time).strftime(''%Y-%m-%dT%H:%M:%SZ'')
Donde posix_time es el tiempo de la época de Posix que quieres convertir
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''
Puedes convertir la hora actual de esta manera.
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
Puedes usar easy_date para hacerlo más fácil:
import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
Un trazador de líneas rápido y sucio:
''-''.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))
''2013-5-5-1-9-43''
Utilice el módulo de datetime
:
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''))
acabo de utilizar con éxito:
>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
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.
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)
Tomado de http://seehuhn.de/pages/pdate
>>> 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''
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime(''%Y-%m-%d %H:%M:%S'')
print temp