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

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

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


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


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'

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

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'


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

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'

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.


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:


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

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


1

eu apenas usei com sucesso:

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

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'


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.