2015-09-01 16 views
5

Ho un file csv con il datetime nel formato unixtimestamp con millisecondi e informazioni sul fuso orario anche in millisecondi. Voglio convertirlo in un formato datetime più utilizzabile per ulteriori elaborazioni.Python: come convertire unixtimestamp e timezone in oggetto datetime?

Ad esempio, l'ora è 1437323953822 e il fuso orario è -14400000.

posso convertire il timestamp in un datetime utilizzando

datetime.datetime.fromtimestamp(1437323953822/1000) 

ma come faccio ora incorporare il fuso orario UTC -4 tempo da quello che so.

(-14400000/1000/60/60) = -4 

Come utilizzare questo fuso orario per ottenere l'ora effettiva?

+0

Quando dici tempo reale cosa intendi? Stai cercando l'ora UTC? –

+0

Desidero l'ora locale effettiva. – sfactor

+0

Dovresti ottenere l'ora esatta corretta giusto? Stai ottenendo invece l'UTC? –

risposta

1

fromtimestamp può anche prendere un altro parametro per il fuso orario, una sottoclasse di tzinfo:

classmethod datetime.fromtimestamp(timestamp[, tz])

ritorno la data e l'ora locale corrispondente al timestamp POSIX, come restituito da time.time(). Se l'argomento facoltativo tz è Nessuno o non specificato, il timestamp viene convertito in data e ora locali della piattaforma e l'oggetto datetime restituito è naive.

resto tz deve essere un'istanza di una classe tzinfo sottoclasse, e il timestamp viene convertita fuso tz s’. In questo caso il risultato è equivalente a tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz)).

0

fromtimestamp() già restituisce l'ora locale vale a dire, non è necessario allegare l'offset UTC se fromtimestamp() determina correttamente automaticamente:

#!/usr/bin/env python 
from datetime import datetime 

local_time = datetime.fromtimestamp(1437323953822 * 1e-3) 
# -> datetime.datetime(2015, 7, 19, 12, 39, 13, 822000) 

fromtimestamp() in alcuni casi potrebbe non riuscire, ad esempio, se il fuso orario locale ha avuto un offset utc diverso in passato e fromtimestamp() non utilizza un database storico fuso orario su una determinata piattaforma (in particolare Windows). In tal caso, costruire l'ora locale esplicitamente dal tempo UTC e l'offset in UTC:

#!/usr/bin/env python 
from datetime import datetime, timedelta 

utc_time = datetime(1970, 1, 1) + timedelta(milliseconds=1437323953822) 
utc_offset = timedelta(milliseconds=-14400000) 
local_time = utc_time + utc_offset 
# -> datetime.datetime(2015, 7, 19, 12, 39, 13, 822000) 

Python always expects POSIX Epoch e quindi è ok per codificare esso. La formula esplicita può essere più precisa (nessun errore di arrotondamento) e può accettare un intervallo più ampio di timestamp di input (l'intervallo fromtimestamp() dipende dalla piattaforma e potrebbe essere più stretto del corrispondente intervallo datetime).

Problemi correlati