Jak przekonwertować całkowitą sygnaturę czasową na datę i godzinę w Pythonie

189

Mam plik danych zawierający znaczniki czasu, takie jak „1331856000000”. Niestety nie mam dużo dokumentacji dotyczącej tego formatu, więc nie jestem pewien, jak sformatowany jest znacznik czasu. Wypróbowałem standard Pythonadatetime.fromordinal() i datetime.fromtimestamp()i kilka innych, ale mecze nic. Jestem pewien, że ta konkretna liczba odpowiada bieżącej dacie (np. 2012-3-16), ale niewiele więcej.

Jak przekonwertować ten numer na datetime?

Cerin
źródło

Odpowiedzi:

329

datetime.datetime.fromtimestamp()jest poprawny, z tym wyjątkiem, że prawdopodobnie masz znacznik czasu w milisekundach (jak w JavaScript), ale fromtimestamp()oczekuje znacznika czasu Unix w sekundach.

Zrób to tak:

>>> import datetime
>>> your_timestamp = 1331856000000
>>> date = datetime.datetime.fromtimestamp(your_timestamp / 1e3)

a wynikiem jest:

>>> date
datetime.datetime(2012, 3, 16, 1, 0)

Czy to odpowiada na twoje pytanie?

EDYCJA : JF Sebastian poprawnie zaproponował użycie prawdziwego dzielenia przez 1e3(zmiennoprzecinkowe 1000). Różnica jest znacząca, jeśli chcesz uzyskać dokładne wyniki, dlatego zmieniłem odpowiedź. Różnica wynika z domyślnego zachowania Pythona 2.x, które zawsze powraca intprzy dzieleniu (za pomocą /operatora) intprzez int(jest to nazywane dzieleniem podłogi ). Przez zastąpienie dzielnika 1000(będącego an int) przez 1e3dzielnik (będący reprezentacją 1000jako zmiennoprzecinkowego) lub przez float(1000)(lub 1000.itd.), Podział staje się itp. I gdy w znaczniku czasu przekazywanym do prawdziwym podziałem . Python 2.x zwraca floatdzielenie intprzez float, floatprzez int,floatprzezfloatfromtimestamp() metoda, wynik tej metody zawiera również informacje o tej części ułamkowej (jako liczbie mikrosekund).

Tadeck
źródło
13
użyj prawdziwego podziału:/ 1e3
jfs
@JFSebastian: Masz całkowitą rację, zredagowałem moją odpowiedź i dodałem wyjaśnienie, dlaczego masz rację. Jeśli nie zgadzasz się z wyjaśnieniem, daj mi znać.
Tadeck
@ manu-fatto: To naprawdę nie ma znaczenia. x * 0.001i x / 1e3oba są takie same, różnica polega na zapisie i długości (oryginalny jest krótszy). Dla niektórych osób może być łatwiejsze dzielenie przez liczbę zamiast mnożenia przez multiplikatywną liczbę odwrotną ( 1/x), którą zaproponowałeś. Ale dziękuję za zaproponowanie alternatywnego podejścia.
Tadeck,
58
Ta funkcja jest niebezpieczna, ponieważ bierze pod uwagę strefę czasową. Spróbuj wyszukać utcfromtimestamp
Haim Bender
12
@HaimBender Thanks! Wydaje mi się, że twoje komentarze zasługują na więcej uwagi. fromtimestampPodaj datę i godzinę w czasie lokalnym Podaj utcfromtimestampdatę i godzinę w UTC.
yusong