Converter data da string em timestamp em Python

219

Como converter uma string no formato "%d/%m/%Y"em timestamp?

"01/12/2011" -> 1322697600
Shankar Cabus
fonte
Qual é o segundo número? Época da época do Unix?
Hasteur
4
@ Hasteur, sim. O segundo número representa o número de segundos que passaram entre o início da época do unix e a data especificada. Esse formato também é conhecido como horário POSIX.
eikonomega

Respostas:

316
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
Katriel
fonte
10
assume a meia-noite 01/12/2011 no fuso horário local. Se a entrada estiver em UTC; você poderia usar calendar.timegm()ou.toordinal()
jfs
49
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()é um pouco menor
timdiels
11
@timdiels: novamente. .timestamp()assume a hora local em vez de UTC se nenhum fuso horário explícito for especificado. O código na resposta funciona (produz o esperado 1322697600) apenas em um computador em que o fuso horário local tem deslocamento de utc zero.
JFS
7
isso não funciona: datetime.datetime.strptime ("2014: 06: 28 11:53:21", "% Y:% m:% d% H:% M:% S"). timestamp () Traceback ( última chamada mais recente): Arquivo "<stdin>", linha 1, em <module> AttributeError: 'datetime.datetime' objeto não tem atributo 'timestamp'
Zdenek Maxa
5
@ZdenekMaxa datetime.timestamp () disponível apenas para versões python> = 3.3. docs.python.org/3/whatsnew/3.3.html
joni jones
48

Eu uso ciso8601, que é 62x mais rápido que o tempo de atividade do datetime.

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

Você pode aprender mais aqui .

Eyal Ch
fonte
2
Esta é uma sugestão fantástica. Eu apenas o usei e reduzi toneladas de tempo da minha execução.
David
3
Meu Deus, isso é rápido #
21718
3
E +1 por não precisar que eu explique qual é o formato da sequência de horas.
21819 Gowenfawr
40

Para converter a string em um objeto de 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()

A maneira de converter o objeto de data em carimbo de data / hora do POSIX depende do fuso horário. De conversão datetime.datepara carimbo de data / hora UTC em Python :

  • objeto data representa meia-noite no UTC

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
  • objeto data representa meia-noite no horário local

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

Os carimbos de data e hora são diferentes, a menos que meia-noite no UTC e na hora local sejam a mesma instância de hora.

jfs
fonte
Quando eu executar os exemplos neste post, eu recebo o erro: NameError: name 'wckCalendar' is not defined. Estou executando o Python 3.4.1 em uma máquina Windows de 32 bits. Qualquer ideia? Obrigado.
sedeh 14/08/14
1
@sedeh não há wckCalendar no post. Verifique seu código.
JFS
@JFSebastian Exatamente, e eu não estava tentando ligar diretamente para o wckCalendar. Apenas aparece na mensagem de erro. Veja meu post aqui discutindo o problema.
sedeh 14/08/14
1
@ törzsmókus: Se a resposta estiver errada, não importa o quão legível seja.
jfs
1
@ törzsmókus: veja minha resposta: ela pode produzir dois números diferentes. Sua resposta produz um número sem mencionar qual.
jfs
30
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
San4ez
fonte
10
"%s"não é suportado pelo Python . Não é portátil.
JFS
Legibilidade conta. Veja minha resposta com o dateutil para uma solução muito mais legível por humanos.
törzsmókus 18/09/17
21

A resposta depende também do fuso horário da data de entrada. Se a sua data é local, você pode usar mktime () como o katrielalex disse - só que não vejo por que ele usou o datetime em vez desta versão mais curta:

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

Mas observe que meu resultado é diferente do dele, pois provavelmente estou em uma TZ diferente (e o resultado é o carimbo de data / hora do UNIX sem fuso horário)

Agora, se a data de entrada já estiver no UTC, acredito que a solução certa seja:

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600
Nowakus
fonte
Eu acho que isso é melhor. Não há necessidade de importar 'hora' e 'data / hora'.
Kennyut
17

Basta usar datetime.datetime.strptime:

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

Resultado:

1322697600

Para usar o UTC em vez do fuso horário local, use .replace:

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()
nm111
fonte
Para uma resposta completa, você deve dizer que é válido apenas para python 3.3+
Eduardo
No primeiro exemplo, o resultado é floatnãoint
CONvid19 17/06
6

Primeiro você deve a classe strptime para converter a string em um formato struct_time.

Em seguida, basta usar o mktime de lá para pegar seu carro alegórico.

Cryptite
fonte
6

Muitas dessas respostas não se preocupam em considerar que a data é ingênua para começar.

Para estar correto, você precisa tornar a data ingênua um fuso horário com data e hora primeiro

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

Além disso:

Tenha cuidado, usando pytzfor tzinfoem um datetime.datetimeNÃO FUNCIONA por muitos fusos horários. Veja data e hora com pytz fuso horário. Deslocamento diferente, dependendo de como o tzinfo está definido

# 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

MrE
fonte
6

Eu sugeriria dateutil :

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
törzsmókus
fonte
Está errado. O OP espera tempo no "%d/%m/%Y"formato. Compare: dateutil.parser.parse("01/02/2001")edatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs
obrigado @jfs, boa captura. Eu atualizei minha resposta de acordo. (como um não-americano, eu não teria pensado o M ilógico / formato D / Y foi o padrão para o analisador.)
törzsmókus
1
ele não produz o esperado, a 1322697600menos que o fuso horário local seja UTC. Veja meu comentário de 2014
jfs
4

Parece ser bastante eficiente:

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

1,61 µs ± 120 ns por loop (média ± desvio padrão de 7 execuções, 100000 loops cada)

Gerard
fonte
Qual é a datetimefunção? datetimeda datetimebiblioteca não oferece suporte.timestamp()
Joooeey 17/04/19
@Joooeey: Sim , no Python 3.3 ou posterior . Não estava disponível quando a pergunta foi publicado, mas está disponível desde setembro de 2012.
ShadowRanger
0

basta usar datetime.timestamp (sua instância de datetime), a instância datetime contém as informações do fuso horário; portanto, o timestamp será um timestamp utc padrão. se você transformar a data e hora em horário, ela perderá o fuso horário; portanto, o resultado será um erro. se você deseja fornecer uma interface, escreva assim: int (datetime.timestamp (time_instance)) * 1000

user6689187
fonte
0

você pode converter para isoformato

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

Uma função simples para obter o tempo UNIX Epoch.

NOTA : Esta função supõe que a data e hora de entrada estejam no formato UTC (consulte os comentários aqui).

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

Uso :

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
gihanchanuka
fonte