2015-05-26 20 views
5

Ho la seguente stringa:Come convertire la stringa timestamp di Python in epoch?

mytime = "2009-03-08T00:27:31.807Z" 

Come faccio a convertirlo in epoca in pitone?

ho provato:

import time 
p = '%Y-%m-%dT%H:%M:%S' 
int(time.mktime(time.strptime(s, p))) 

Ma non funziona con il 31.807Z.

+0

come hai usato% S ottenere qualcosa come '.807Z'? % S viene visualizzato come numero decimale – haifzhan

risposta

3

Manca .%fZ dalla stringa di formato.

p = '%Y-%m-%dT%H:%M:%S.%fZ' 

Il modo corretto per convertire in epoca è quello di utilizzare datetime:

from datetime import datetime 

p = '%Y-%m-%dT%H:%M:%S.%fZ' 
mytime = "2009-03-08T00:27:31.807Z" 
epoch = datetime(1970, 1, 1) 
print((datetime.strptime(mytime, p) - epoch).total_seconds()) 

Oppure chiamate int, se si desidera ignorare le frazioni.

+0

e funziona perfettamente finché termina in Z: P –

+1

@JoranBeasley. Nella mia infinita saggezza ho previsto che finirebbe sempre in 'Z', suppongo che potresti sempre ignorare' Z' e rstrip ("Z") –

+1

non usare 'time.mktime()' in tempo UTC! – jfs

1

Codice:

import datetime 
epoch = datetime.datetime(1970, 1, 1) 

mytime = "2009-03-08T00:27:31.807Z" 
myformat = "%Y-%m-%dT%H:%M:%S.%fZ" 
mydt = datetime.datetime.strptime(mytime, myformat) 
val = (mydt - epoch).total_seconds() 

print(val) 
> 1236472051.81 
repr(val) 
> '1236472051.807' 

Note:

  • Quando si utilizza time.strptime(), il restituita time.struct_time non supporta sub-secondi di precisione.
  • Il %fformat è per microsecondi. Durante l'analisi non è necessario che siano le 6 cifre complete.
1

dateutil è l'unica biblioteca ho trovato che correttamente si occupa di identitifier compensato il fuso orario (Z)

pip install python-dateutil 

poi

from dateutil.parser import parse as date_parse 
print date_parse("2009-03-08T00:27:31.807Z") 
#get timestamp 

import calendar 
dt = date_parse("2009-03-08T00:27:31.807Z") 
timestamp1 = calendar.timegm(dt.timetuple()) 
+1

probabilmente una soluzione più robusta. –

+0

@PadraicCunningham: è meno robusto se si desidera rifiutare i timestamp che utilizzano un formato errato. 'dateutil' potrebbe accettare troppo. – jfs

+0

è eccessivo usare "dateutil" per quello. Puoi analizzare la stringa del tempo usando solo stdlib sia in Python 2 che in 3. 'timegm()' è ok se non ti preoccupi di frazioni di secondo. – jfs

12

Ci sono due parti:

  1. Converti la stringa del tempo in un tempo di interruzione. Vedi How to parse ISO formatted date in python?
  2. Convert the UTC time to "seconds since the Epoch" (POSIX timestamp).
#!/usr/bin/env python 
from datetime import datetime 

utc_time = datetime.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ") 
epoch_time = (utc_time - datetime(1970, 1, 1)).total_seconds() 
# -> 1236472051.807 

Se si è certi che si desidera ignorare frazioni di secondo e per ottenere un risultato intero:

#!/usr/bin/env python 
import time 
from calendar import timegm 

utc_time = time.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ") 
epoch_time = timegm(utc_time) 
# -> 1236472051 

Per sostenere timestamp che corrispondono a un secondo salto, come Wed July 1 2:59:60 MSK 2015 , potresti use a combination of time.strptime() and datetime (if you care about leap seconds you should take into account the microseconds too).

+0

cosa succede se si ottiene "2009-03-08T00: 27: 31.807A" o qualsiasi offset dal tempo zulu? ma +1 per la conversione dell'ora delle impostazioni internazionali :) –

+0

@JoranBeasley non è corretto A non è consentito – jfs