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

Se ho un formato simile a quello di STRING, come posso trasformarlo in un timestamp unix?In Python, come posso trasformare questo formato in un timestamp unix?

Nota: sto ricevendo questo formato dalle API di Twitter:

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

+0

Avrai bisogno di analizzarlo: http://docs.python.org/library/datetime.html#strftime-strptime-behavior – Blender

+0

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

+0

@Blender: il formato dell'OP sembra essere complicato. Per '+ 0000' ha bisogno di'% z' ma questo risulta in 'ValoreErrore: 'z' è una direttiva non valida nel formato '% a% b% d% H:% M:% S% z% Y'' – ThiefMaster

risposta

1
+0

Quindi, perché non includere un codice di esempio che effettivamente analizza il formato che ha usato senza errori? – ThiefMaster

+0

quindi devi convertire in unix timestamp ... vedi http://stackoverflow.com/questions/2775864/python-datetime-to-unix-timestamp @thiefmaster ... Penso che la risposta di speranza sia sufficiente per ottenerlo dove vuole essere oltre a permettergli di capirlo per altri formati –

+0

@JoranBeasley: Vedi il mio commento sulla domanda. Il suo formato apparentemente non * è * banale da analizzare. – ThiefMaster

8

L'opzione migliore sta usando dateutil.parser.parse() che ti dà una datetime oggetto con informazioni sul fuso orario corrette:

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

Ora solo bisogno di convertirlo in un UNIX timestamp:

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

Il formato avete può anche essere facilmente analizzato utilizzando 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' 

Questa è in realtà come implementare email.utils.parsedate_to_datetime in Python 3.3 (se si desidera copiare & incollarlo nel progetto, posizionare __parsedate_tz con parsedate_tz da 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

Se il fuso orario è noto per essere sempre 0000, è possibile utilizzare:

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

Questo restituisce una struttura datetime. Se avete bisogno di unix secondi dal periodo, attraversano time.mktime(), come questo:

>>> 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() se davvero il fuso orario è sempre UTC.

Problemi correlati