Konwertowanie uniksowego ciągu datownika na czytelną datę


825

Mam ciąg reprezentujący uniksowy znacznik czasu (tj. „1284101485”) w Pythonie i chciałbym przekonwertować go na czytelną datę. Kiedy używam time.strftime, otrzymuję 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
link do pytania również o konwersję z powrotem: stackoverflow.com/q/19801727/3273031
slushy

Odpowiedzi:


1209

Użyj datetimemodułu:

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()może się nie powieść dla poprzednich dat, jeśli lokalna strefa czasowa miała inne przesunięcie utc. Potrzebujesz historycznej bazy danych stref czasowych, takiej jak dostarczona przez pytzmoduł (lub system operacyjny). Lub po prostu pracuj w UTC i używaj .utcfromtimestamp().
jfs,

9
@JFSebastian Wspomniałeś, że to może się nie powieść w kilku komentarzach - czy mógłbyś wyjaśnić, dlaczego to się nie powiedzie w poprzednich datach / czasach? (Sądząc po opiniach, wiele osób zgadza się z tobą i postrzega to jako proste) Z pewnością jakiś znacznik czasu unix ma prostą równoważną datę / godzinę?
davidhood2

3
@ davidhood2 weź system, w którym Python nie ma dostępu do bazy danych tz (Windows), ustaw lokalną strefę czasową na strefę czasową, która miała inne przesunięcie UTC w przeszłości (np. Europa / Moskwa), wywołaj fromtimestamp () ze znacznikami czasu z przeszłości (2011–). Porównaj wyniki z wartościami obliczonymi za pomocą pytz. Jeśli nie jest jasne; zadaj osobne pytanie dotyczące przepełnienia stosu.
jfs


6
Punktem importu jest znacznik czasu w sekundach od epoki; jeśli masz milisekundy, musisz podzielić przez 1000, jak właśnie się dowiedziałem.
wordsforthewise


145

Najczęściej głosowana odpowiedź sugeruje użycie fromtimestamp, który jest podatny na błędy, ponieważ wykorzystuje lokalną strefę czasową. Aby uniknąć problemów, lepszym rozwiązaniem jest użycie UTC:

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

Gdzie posix_time to czas epoki Posix, który chcesz przekonwertować


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()i time.localtime()może nie powieść się dla poprzednich dat, jeśli lokalna strefa czasowa miała inne przesunięcie utc. Potrzebujesz historycznej bazy danych stref czasowych, takiej jak dostarczona przez pytzmoduł (lub system operacyjny). Lub po prostu pracuj w UTC i używaj time.gmtime(). datetimemoże zapewnić szerszy zakres dat, więc datetime.utcfromtimestamp()może być używany zamiast timefunkcji.
jfs

66

Istnieją dwie części:

  1. Konwertuj uniksowy znacznik czasu („sekundy od epoki”) na czas lokalny
  2. Wyświetl czas lokalny w żądanym formacie.

Przenośnym sposobem na uzyskanie czasu lokalnego, który działa, nawet jeśli lokalna strefa czasowa miała w przeszłości inne przesunięcie utc, a python nie ma dostępu do bazy danych tz, należy użyć pytzstrefy czasowej:

#!/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)

Aby go wyświetlić, możesz użyć dowolnego formatu czasu obsługiwanego przez Twój system, np .:

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

Jeśli nie potrzebujesz czasu lokalnego, aby zamiast tego uzyskać czytelny czas UTC:

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

Jeśli nie przejmujesz się problemami strefy czasowej, które mogą wpłynąć na datę zwrotu lub jeśli python ma dostęp do bazy danych tz w twoim systemie:

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

W Pythonie 3 można uzyskać strefę czasową uwzględniającą strefę czasową, używając tylko stdlib (przesunięcie UTC może być nieprawidłowe, jeśli python nie ma dostępu do bazy danych tz w systemie, np. W systemie 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)"))

Funkcje z timemodułu są cienkimi opakowaniami wokół odpowiedniego interfejsu API języka C i dlatego mogą być mniej przenośne niż odpowiednie datetimemetody, w przeciwnym razie możesz ich również użyć:

#!/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))  

To powinna być najczęściej głosowana odpowiedź, jeśli zależy Ci na czasie lokalnym.
azzamsa

36

Dla czytelnego dla człowieka znacznika czasu z znacznika czasu UNIX używałem go wcześniej w skryptach:

import os, datetime

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

Wynik:

„26 grudnia 2012 r.”


25

Możesz przekonwertować aktualny czas w ten sposób

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

Aby przekonwertować datę w ciągu na różne formaty.

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

Oprócz korzystania z pakietu czas / data / godzina , pandy mogą być również użyte do rozwiązania tego samego problemu. Oto jak możemy użyć pand do konwersji znacznika czasu na czytelną datę :

Znaczniki czasu mogą być w dwóch formatach:

  1. 13 cyfr (milisekund) - Aby przekonwertować milisekundy do tej pory, użyj:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 cyfr (sekund) - Aby przekonwertować sekundy na datę, użyj:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'

Wydaje się, że kolejna wygrana dla pand - moduł jest fantastyczny we wszystkim
Vaidøtas Ivøška

21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Uzyskaj czytelną datę ze znacznika czasu z czasem, a także możesz zmienić format daty.


5
Co ta odpowiedź dodaje do tej odpowiedzi?
kocica

1
Dodaj ostrzeżenie związane z kwestią założenia lokalnej strefy czasowej. Najlepszą praktyką w programowaniu jest przechowywanie znaczników czasu jako czasów UTC zamiast lokalnych znaczników czasu. Ale powyższy przykład zwróci nieprawidłowy czas, jeśli lokalna strefa czasowa nie jest UTC.
Timothy C. Quinn

20

W Python 3.6+:

import datetime

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

Wynik:

2020-01-15 19:51:41

Wyjaśnienie:


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

6

Kolejny sposób, w jaki można to zrobić za pomocą funkcji gmtime i formatowania;

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

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


1

właśnie z powodzeniem zastosowałem:

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

0

szybka i brudna jedna wkładka:

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

„2013-5-5-1-9-43”


3
Lub bardziej zwięźle: '-'. Join (map (str, datetime.datetime.now (). Timetuple () [: 6]))
Jelle Zijlstra

2
@JelleZijlstra Eh, zdecydowanie wolę wyrażenie generatora niż mapę.
crhodes

4
Jakim formatem daty jest „2013-5-5-1-9-43”? Nigdy nigdzie nie widziałem tego formatu jako prawidłowej reprezentacji daty / godziny.
madoki,

czy możesz wyjaśnić, co kwalifikuje to jako niepoprawną reprezentację @madoki? masz na myśli niestandardowy? Podstawową zaletą, jaką ma nad większością innych odpowiedzi, jest możliwość włączenia go do ścieżki pliku lub katalogu, ponieważ spacje i dwukropki nie znajdują się w zestawie standardowych znaków katalogu unix. patrz np. stackoverflow.com/a/458001/209246
eqzx

0

Aby ułatwić, możesz użyć easy_date :

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

5
Każde programowanie ma swoje własne konwertery daty i godziny. Nigdy nie należy do tego używać modów / frameworków
JosFabre

strptimei strftimenie jest intuicyjny ... A nawet nieczytelny ... Ale rozumiem i szanuję twoją opinię
Raphael Amoedo

4
To, że „nigdy nie trzeba korzystać”, jest złe. Zależy to od języka i jakości wbudowanych bibliotek lib. JavaScript ma momenty.js, a Java ma czas Joda, które są bardziej popularne niż odpowiednie wbudowane narzędzia do konwersji daty i czasu (tak bardzo, że czas Joda później wpłynął na zaktualizowane standardowe biblioteki Java 8). To powiedziawszy, chyba że pytanie wymaga miłych bibliotek stron trzecich, lepiej dać odpowiedź na podstawie standardowej biblioteki.
Hejazzman,

Poprawiłem @NikosVentouras. Właśnie miałem problem „Data JS w IE zachowuje się inaczej” po raz pierwszy. Więc skończyło się na użyciu mom.js
JosFabre
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.