2012-07-09 13 views
8
Mon Jul 09 09:20:28 +0000 2012 

Si tengo un formato como STRING, ¿cómo puedo convertirlo en una marca de tiempo Unix?En Python, ¿cómo puedo convertir este formato en una marca de tiempo de Unix?

Nota: Estoy recibiendo este formato de API de Twitter:

https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=twitter

+0

Tendrá que analizarlo: http://docs.python.org/library/datetime.html#strftime-strptime-behavior – Blender

+0

vea esto http://devpython.com/2011/08/11/convert -utc-date-string-to-unix-timestamp/ –

+0

@Blender: El formato del OP parece ser complicado. Para el '+ 0000' él necesita'% z' pero eso da como resultado 'ValueError: 'z' es una mala directiva en formato '% a% b% d% H:% M:% S% z% Y'' – ThiefMaster

Respuesta

1
+0

Entonces, ¿por qué no incluir algún código de ejemplo que realmente analiza el formato que él utilizado sin un error? – ThiefMaster

+0

luego necesita convertir a la marca de tiempo de Unix ... vea http://stackoverflow.com/questions/2775864/python-datetime-to-unix-timestamp @thiefmaster ... Creo que la respuesta de la esperanza es suficiente para conseguirlo donde él quiere estar así como también permitiéndole descubrir otros formatos –

+0

@JoranBeasley: Vea mi comentario sobre la pregunta. Su formato aparentemente no es * tan * trivial de analizar. – ThiefMaster

8

La mejor opción es usar dateutil.parser.parse() que le da una datetime objeto con información adecuada de zona horaria:

>>> import dateutil.parser 
>>> dt = dateutil.parser.parse('Mon Jul 09 09:20:28 +0200 2012') 
>>> dt 
datetime.datetime(2012, 7, 9, 9, 20, 28, tzinfo=tzoffset(None, 7200)) 

Ahora sólo tiene que convertirlo en una marca de tiempo UNIX:

>>> import time 
>>> int(time.mktime(dt.timetuple())) 
1341822028 

El formato tiene también se puede analizar fácilmente usando email.utils.parsedate_tz:

>>> import datetime 
>>> import email.utils 
>>> parts = email.utils.parsedate_tz('Mon Jul 09 09:20:28 +0200 2012') 
>>> dt = datetime.datetime(*parts[:6]) - datetime.timedelta(seconds=parts[-1]) 
>>> str(dt) 
'2012-07-09 07:20:28' 

Esto es en realidad cómo se implementa email.utils.parsedate_to_datetime en Python 3.3 (si desea copiar & pegue esto en su proyecto, colocar __parsedate_tz con parsedate_tz de email.utils):

def parsedate_to_datetime(data): 
    if not data: 
     return None 
    *dtuple, tz = __parsedate_tz(data) 
    if tz is None: 
     return datetime.datetime(*dtuple[:6]) 
    return datetime.datetime(*dtuple[:6], 
      tzinfo=datetime.timezone(datetime.timedelta(seconds=tz))) 
1

Si la zona horaria es conocido por ser siempre 0000, puede utilizar:

time.strptime('Mon Jul 09 09:20:28 +0000 2012', '%a %b %d %H:%M:%S +0000 %Y') 

Esto devuelve una estructura de fecha y hora. Si necesitas segundos UNIX desde el periodo, correr a través time.mktime(), así:

>>> time.mktime(time.strptime('Mon Jul 09 09:20:28 +0000 2012', '%a %b %d %H:%M:%S +0000 %Y')) 
1341818428.0 

o time.gmtime() si de hecho la zona horaria es GMT siempre.

Cuestiones relacionadas