Convertendo string de carimbo de data / hora unix em data legível

826

Eu tenho uma string representando um carimbo de data / hora unix (ou seja, "1284101485") em Python e gostaria de convertê-lo para uma data legível. Quando uso time.strftime, recebo um TypeError:

>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str
VeryNewToPython
fonte
1
ligação à pergunta para converter de volta também: stackoverflow.com/q/19801727/3273031
slushy

Respostas:

1210

Use o datetimemódulo:

from datetime import datetime
ts = int("1284101485")

# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
Michał Niklas
fonte
131
.fromtimestamp()poderá falhar em datas passadas se um fuso horário local tiver um deslocamento de utc diferente. Você precisa de um banco de dados histórico de fuso horário, como o fornecido pelo pytzmódulo (ou seu sistema operacional). Ou simplesmente trabalhe no UTC e use .utcfromtimestamp().
JFS
9
@JFSebastian Você mencionou que isso pode falhar em alguns comentários - por favor, você pode explicar por que isso falharia em datas / horas passadas? (A julgar pelos votos positivos, muitas pessoas concordam com você e consideram isso simples) Certamente, qualquer carimbo de data / hora unix tem uma data / hora equivalente simples?
davidhood2
3
@ davidhood2 adote um sistema em que o python não tenha acesso ao banco de dados tz (Windows), defina seu fuso horário local como um fuso horário com um deslocamento UTC diferente no passado (por exemplo, Europa / Moscou), chame fromtimestamp () com registros de data e hora do passado (2011-). Compare os resultados com os valores calculados usando pytz. Se não estiver claro; faça uma pergunta separada do Stack Overflow.
JFS
6
Um ponto de importação é que leva um carimbo de data e hora em segundos desde a época; se você tem milissegundos, precisa dividir por 1000, como acabei de descobrir.
wordsforthewise
246
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

Retirado de http://seehuhn.de/pages/pdate

Daniel
fonte
145

A resposta mais votada sugere o uso de fromtimestamp, que é propenso a erros, pois usa o fuso horário local. Para evitar problemas, uma abordagem melhor é usar o UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

Onde posix_time é o período da época Posix que você deseja converter

rkachach
fonte
2
import datetime, pytz datetime.datetime (1990, 1, 1, tzinfo = pytz.utc)
y.selivonchyk
76
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'
John La Rooy
fonte
10
time.ctime()e time.localtime()poderá falhar em datas passadas se um fuso horário local tiver um deslocamento de utc diferente. Você precisa de um banco de dados histórico de fuso horário, como o fornecido pelo pytzmódulo (ou seu sistema operacional). Ou simplesmente trabalhe no UTC e use time.gmtime(). datetimepode fornecer um período mais amplo, datetime.utcfromtimestamp()podendo ser usado em vez de timefunções.
JFS
66

Existem duas partes:

  1. Converta o carimbo de data / hora unix ("segundos desde a época") para a hora local
  2. Exibe a hora local no formato desejado.

Uma maneira portátil de obter a hora local que funciona, mesmo que o fuso horário local tenha um deslocamento de utc diferente no passado e o python não tenha acesso ao banco de dados tz, é usar um pytzfuso horário:

#!/usr/bin/env python
from datetime import datetime
import tzlocal  # $ pip install tzlocal

unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)

Para exibi-lo, você pode usar qualquer formato de hora suportado pelo seu sistema, por exemplo:

print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y"))  # print date in your format

Se você não precisar de um horário local, obtenha um horário UTC legível:

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))

Se você não se importa com os problemas de fuso horário que podem afetar a data retornada ou se o python tem acesso ao banco de dados tz no seu sistema:

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

No Python 3, você pode obter um datetime com reconhecimento de fuso horário usando apenas stdlib (o deslocamento UTC pode estar errado se o python não tiver acesso ao banco de dados tz no seu sistema, por exemplo, no Windows):

#!/usr/bin/env python3
from datetime import datetime, timezone

utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))

As funções do timemódulo são invólucros finos em torno da API C correspondente e, portanto, podem ser menos portáteis que os datetimemétodos correspondentes , caso contrário, você também pode usá-los:

#!/usr/bin/env python
import time

unix_timestamp  = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) 
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))  
jfs
fonte
Deve ser a resposta mais votada se você se preocupa com a hora local.
Azzamsa 20/09/19
36

Para um registro de data e hora legível por humanos a partir de um registro de data e hora do UNIX, usei isso em scripts antes:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

Resultado:

'26 de dezembro de 2012'

Jared Burrows
fonte
25

Você pode converter a hora atual como esta

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

Para converter uma data em sequência para diferentes formatos.

import datetime,time

def createDateObject(str_date,strFormat="%Y-%m-%d"):    
    timeStamp = time.mktime(time.strptime(str_date,strFormat))
    return datetime.datetime.fromtimestamp(timeStamp)

def FormatDate(objectDate,strFormat="%Y-%m-%d"):
    return objectDate.strftime(strFormat)

Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')

Output 03-03-2013
usuario
fonte
24

Além de usar o pacote time / datetime , os pandas também podem ser usados ​​para resolver o mesmo problema.Aqui está como podemos usar os pandas para converter o carimbo de data / hora em data legível :

Os carimbos de data e hora podem estar em dois formatos:

  1. 13 dígitos (milissegundos) - Para converter milissegundos até a data, use:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 dígitos (segundos) - Para converter segundos em data, use:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'
Shubham
fonte
Parece que outra vitória para os pandas - o módulo é fantástico em tudo
Vaidøtas Ivøška
21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Obter a data legível de timestamp com hora também, também você pode alterar o formato da data.

Rishabh Jhalani
fonte
5
O que essa resposta adiciona a essa resposta?
kocica
1
Adicione um aviso relacionado ao problema da suposição de fuso horário local. As melhores práticas de programação são armazenar registros de data e hora como horários UTC em vez de locais. Mas este exemplo acima retornará a hora errada se o fuso horário local não for UTC.
Timothy C. Quinn
21

No Python 3.6+:

import datetime

timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")

Resultado:

2020-01-15 19:51:41

Explicação:

Contango
fonte
6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
itsaruns
fonte
6

Outra maneira de fazer isso usando a função gmtime e format;

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

Resultado: 2018-10-4 11:57:44

h3xus
fonte
1

eu apenas usei com sucesso:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
nimmy
fonte
0

um forro rápido e sujo:

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

'2013-5-5-1-9-43'

eqzx
fonte
3
Ou, de forma mais concisa: '-'. Join (map (str, datetime.datetime.now (). Scheduple () [: 6])))
Jelle Zijlstra
2
@JelleZijlstra Eh, eu prefiro muito a expressão do gerador sobre o mapa.
crhodes
4
Que tipo de formato de data é '2013-5-5-1-9-43'? Nunca vi esse formato em nenhum lugar como uma representação válida de uma data / hora.
Madoki
você pode elaborar o que qualifica isso como uma representação inválida @madoki? você quer dizer fora do padrão? A principal vantagem que ele tem sobre a maioria das outras respostas é a capacidade de incluí-lo em um caminho de arquivo ou diretório, pois espaços e dois pontos não estão no conjunto de caracteres padrão do diretório unix. veja, por exemplo, stackoverflow.com/a/458001/209246
eqzx 22/02
0

Você pode usar easy_date para facilitar:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
Raphael Amoedo
fonte
5
Toda programação possui seus próprios conversores de data e hora. Um nunca deve ter que usar mods / frameworks para este
JosFabre
strptimee strftimenão é intuitivo ... E mesmo não legível ... Mas eu entendo e respeito sua opinião
Raphael Amoedo
4
Que alguém "nunca precise usar" está errado. Depende do idioma e da qualidade das bibliotecas integradas. O Javascript possui moment.js e o Java possui o tempo Joda, que são mais populares do que os respectivos utilitários de conversão de data e hora integrados (tanto que o tempo Joda posteriormente influenciou as bibliotecas padrão atualizadas do Java 8). Dito isto, a menos que a pergunta exija boas bibliotecas de terceiros, é preferível dar uma resposta com base na biblioteca padrão.
Hejazzman
Estou corrigido @NikosVentouras. Acabei de ter o problema "Data JS no IE se comporta de maneira diferente" pela primeira vez. Então, acabei usando moment.js
JosFabre