Converti la data della stringa in timestamp in Python


234

Come convertire una stringa nel formato "%d/%m/%Y"in timestamp?

"01/12/2011" -> 1322697600

Qual è il 2 ° numero? Unix Epoch time?
Hasteur

4
@ Hasteur, sì. Il secondo numero rappresenta il numero di secondi che sono trascorsi tra l'inizio dell'epoca unix e la data specificata. Questo formato è indicato anche come ora POSIX.
eikonomega

Il tempo passa molto velocemente! hai fatto questa domanda alle 13 ... e ora sono le 16 ...
Amir Fo il

Risposte:


335
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0

10
si presume la mezzanotte del 01/12/2011 nel fuso orario locale. Se l'input è in UTC; potresti usare calendar.timegm()o.toordinal()
jfs

56
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()è un po 'più breve
timdiels

11
@timdiels: di nuovo. .timestamp()presuppone l' ora locale invece dell'UTC se non viene fornito un fuso orario esplicito. Il codice nella risposta funziona (produce atteso 1322697600) solo su un computer in cui il fuso orario locale ha offset utc zero.
jfs

9
questo non funziona: datetime.datetime.strptime ("2014: 06: 28 11:53:21", "% Y:% m:% d% H:% M:% S"). timestamp () Traceback ( la chiamata più recente last): File "<stdin>", riga 1, in <module> AttributeError: l'oggetto "datetime.datetime" non ha attributo "timestamp"
Zdenek Maxa

5
@ZdenekMaxa datetime.timestamp () disponibile solo per le versioni python> = 3.3. docs.python.org/3/whatsnew/3.3.html
joni jones

54

Io uso ciso8601, che è 62 volte più veloce dello strptime di datetime.

t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())

Puoi saperne di più qui .


4
questo è un suggerimento fantastico. L'ho appena usato e ho risparmiato tonnellate di tempo dalla mia esecuzione.
David

3
Mio dio, questo è veloce
Hews

3
E +1 per non aver bisogno che io spieghi qual è il formato della stringa dell'ora.
gowenfawr

41

Per convertire la stringa in un oggetto data:

from datetime import date, datetime

date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()

Il modo per convertire l'oggetto data in timestamp POSIX dipende dal fuso orario. Dalla conversione datetime.dateal timestamp UTC in Python :

  • L'oggetto data rappresenta la mezzanotte in UTC

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
    
  • L'oggetto data rappresenta la mezzanotte nell'ora locale

    import time
    
    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())
    

I timestamp sono diversi a meno che la mezzanotte in UTC e l'ora locale non siano la stessa istanza temporale.


Quando eseguo gli esempi in questo post, ottengo l'errore: NameError: name 'wckCalendar' is not defined. Sto eseguendo Python 3.4.1 su una macchina Windows a 32 bit. Qualche idea? Grazie.
sedeh

1
@sedeh non c'è wckCalendar nel post. Controlla il tuo codice.
jfs

@JFSebastian Exactly, e non stavo cercando di chiamare direttamente wckCalendar. Viene visualizzato solo nel messaggio di errore. Vedi il mio post qui che discute del problema.
sedeh

1
@ törzsmókus: Se la risposta è sbagliata, non importa quanto sia leggibile.
jfs

1
@ törzsmókus: guarda la mia risposta: potrebbe produrre due numeri diversi. La tua risposta produce un numero senza menzionare quale.
jfs


23

La risposta dipende anche dal fuso orario della data di input. Se la tua data è una data locale, puoi usare mktime () come ha detto katrielalex - solo che non vedo perché ha usato datetime invece di questa versione più breve:

>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0

Ma osserva che il mio risultato è diverso dal suo, poiché probabilmente sono in una TZ diversa (e il risultato è un timestamp UNIX senza fuso orario)

Ora, se la data di input è già in UTC, credo che la soluzione giusta sia:

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600

Penso che sia meglio. Non è necessario importare sia "time" che "datetime".
kennyut

19

Usa semplicemente datetime.datetime.strptime:

import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())

Risultato:

1322697600

Per utilizzare UTC invece del fuso orario locale, utilizza .replace:

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()

2
Per una risposta completa devi dire che è valido solo per python 3.3+
Eduardo

Nel primo esempio, il risultato è un floatnonint
Pedro Lobito il

7

Molte di queste risposte non si preoccupano di considerare che la data è ingenua per cominciare

Per essere corretti, devi prima rendere la data ingenua un datetime che riconosce il fuso orario

import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011', '%d/%m/%Y')
>>> datetime.datetime(2011, 12, 1, 0, 0)

# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)
>>> datetime.datetime(2011, 12, 1, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)
>>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=<UTC>)

# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)
>>> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)

# get the total second difference
ts = (d - epoch).total_seconds()
>>> 1322726400.0

Anche:

Fai attenzione, l'uso di pytzfor tzinfoin a datetime.datetimeNON FUNZIONA per molti fusi orari. Vedi datetime con fuso orario pytz. Offset diverso a seconda di come è impostato tzinfo

# Don't do this:
d = datetime.datetime(2011, 12, 1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))
>>> datetime.datetime(2011, 1, 12, 0, 0, 
tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>)
# tzinfo in not PST but LMT here, with a 7min offset !!!

# when converting to UTC:
d = d.astimezone(pytz.UTC)
>>> datetime.datetime(2011, 1, 12, 7, 53, tzinfo=<UTC>)
# you end up with an offset

https://en.wikipedia.org/wiki/Local_mean_time


6

Per prima cosa devi la classe strptime per convertire la stringa in un formato struct_time.

Quindi usa mktime da lì per ottenere il tuo float.


6

Suggerirei dateutil :

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()

È sbagliato. OP si aspetta l'ora in "%d/%m/%Y"formato. Confronta: dateutil.parser.parse("01/02/2001")edatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs

grazie @jfs, buona cattura. Ho aggiornato di conseguenza la mia risposta. (come non americano, non avrei pensato che il formato illogico M / D / Y fosse l'impostazione predefinita per il parser.)
törzsmókus

1
non produce il previsto a 1322697600meno che il fuso orario locale non sia UTC. Vedi il mio commento del 2014
jfs

4

Sembra essere abbastanza efficiente:

import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()

1,61 µs ± 120 ns per loop (media ± dev. Std. Di 7 analisi, 100000 loop ciascuna)


1
Qual è la datetimefunzione? datetimedalla datetimelibreria non supporta.timestamp()
Joooeey

1
@Joooeey: Sì , su Python 3.3 o successivo . Non era disponibile quando la domanda è stata pubblicata, ma è disponibile da settembre 2012.
ShadowRanger

1

puoi convertire in isoformat

my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()

0

basta usare datetime.timestamp (la tua istanza datetime), l'istanza datetime contiene le informazioni sul fuso orario, quindi il timestamp sarà un timestamp utc standard. se si trasforma la data e l'ora in timesuple, perderà il fuso orario, quindi il risultato sarà un errore. se vuoi fornire un'interfaccia, dovresti scrivere in questo modo: int (datetime.timestamp (time_instance)) * 1000



-1

Una semplice funzione per ottenere l'ora di UNIX Epoch.

NOTA : questa funzione presuppone che l'ora della data di input sia in formato UTC (fare riferimento ai commenti qui).

def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
    import datetime, calendar
    ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
    return calendar.timegm(ts.utctimetuple())

Utilizzo :

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.