Konvertieren einer Unix-Zeitstempelzeichenfolge in ein lesbares Datum

825

Ich habe eine Zeichenfolge, die einen Unix-Zeitstempel (dh "1284101485") in Python darstellt, und möchte sie in ein lesbares Datum konvertieren. Wenn ich benutze time.strftime, bekomme ich ein 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
quelle
1
Link zur Frage für die Rückkonvertierung
matschig

Antworten:

1210

Verwendung - datetimeModul:

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
quelle
131
.fromtimestamp()kann für vergangene Daten fehlschlagen, wenn eine lokale Zeitzone einen anderen UTC-Offset hat. Sie benötigen eine historische Zeitzonendatenbank, wie sie vom pytzModul (oder Ihrem Betriebssystem) bereitgestellt wird . Oder arbeiten Sie einfach in UTC und verwenden Sie .utcfromtimestamp().
JFS
9
@JFSebastian Sie haben in einigen Kommentaren erwähnt, dass dies möglicherweise fehlschlägt. Können Sie bitte erläutern, warum dies bei früheren Daten / Zeiten fehlschlagen würde? (Gemessen an den positiven Stimmen stimmen viele Menschen Ihnen zu und sehen dies als unkompliziert an.) Sicherlich hat jeder Unix-Zeitstempel ein einfaches äquivalentes Datum / eine äquivalente Uhrzeit?
Davidhood2
3
@ davidhood2 Nehmen Sie ein System, in dem Python keinen Zugriff auf die tz-Datenbank (Windows) hat, stellen Sie Ihre lokale Zeitzone auf eine Zeitzone ein, die in der Vergangenheit einen anderen UTC-Versatz hatte (z. B. Europa / Moskau), und rufen Sie fromtimestamp () mit Zeitstempeln aus der Vergangenheit auf (2011-). Vergleichen Sie die Ergebnisse mit Werten, die mit berechnet wurden pytz. Wenn es unklar ist; Stellen Sie eine separate Frage zum Stapelüberlauf.
JFS
3
@ davidhood2: Ich habe meine eigene Antwortpytz gepostet , die die Lösung demonstriert .
JFS
6
Ein Importpunkt ist, dass dies einen Zeitstempel in Sekunden seit der Epoche benötigt. Wenn Sie Millisekunden haben, müssen Sie durch 1000 teilen, wie ich gerade herausgefunden habe.
Worte für den
246
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

Entnommen aus http://seehuhn.de/pages/pdate

Daniel
quelle
145

Die am häufigsten gewählte Antwort schlägt die Verwendung von fromtimestamp vor, das fehleranfällig ist, da es die lokale Zeitzone verwendet. Um Probleme zu vermeiden, ist es besser, UTC zu verwenden:

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

Dabei ist posix_time die Posix-Epochenzeit, die Sie konvertieren möchten

rkachach
quelle
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
quelle
10
time.ctime()und time.localtime()kann für vergangene Daten fehlschlagen, wenn eine lokale Zeitzone einen anderen utc-Offset hat. Sie benötigen eine historische Zeitzonendatenbank, wie sie vom pytzModul (oder Ihrem Betriebssystem) bereitgestellt wird . Oder arbeiten Sie einfach in UTC und verwenden Sie time.gmtime(). datetimebietet möglicherweise einen größeren Datumsbereich und kann daher datetime.utcfromtimestamp()anstelle von timeFunktionen verwendet werden.
JFS
66

Es gibt zwei Teile:

  1. Konvertieren Sie den Unix-Zeitstempel ("Sekunden seit der Epoche") in die Ortszeit
  2. Zeigen Sie die Ortszeit im gewünschten Format an.

Eine tragbare Methode, um die Ortszeit abzurufen, die auch dann funktioniert, wenn die lokale Zeitzone in der Vergangenheit einen anderen utc-Offset hatte und Python keinen Zugriff auf die tz-Datenbank hat, ist die Verwendung einer pytzZeitzone:

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

Zur Anzeige können Sie ein beliebiges Zeitformat verwenden, das von Ihrem System unterstützt wird, z.

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

Wenn Sie keine Ortszeit benötigen, erhalten Sie stattdessen eine lesbare UTC-Zeit:

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

Wenn Sie sich nicht für die Zeitzonenprobleme interessieren, die sich auf das zurückgegebene Datum auswirken könnten, oder wenn Python Zugriff auf die tz-Datenbank auf Ihrem System hat:

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

Unter Python 3 können Sie eine zeitzonenbezogene Datums- und Uhrzeitangabe nur mit stdlib erhalten (der UTC-Offset ist möglicherweise falsch, wenn Python auf Ihrem System keinen Zugriff auf die tz-Datenbank hat, z. B. unter 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)"))

Funktionen des timeModuls sind Thin Wrapper um die entsprechende C-API und daher möglicherweise weniger portabel als die entsprechenden datetimeMethoden, da Sie sie sonst auch verwenden könnten:

#!/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
quelle
Es sollte die am häufigsten gewählte Antwort sein, wenn Sie sich für die Ortszeit interessieren.
Azzamsa
36

Für einen von Menschen lesbaren Zeitstempel aus einem UNIX-Zeitstempel habe ich diesen zuvor in Skripten verwendet:

import os, datetime

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

Ausgabe:

"26. Dezember 2012"

Jared Burrows
quelle
25

Sie können die aktuelle Zeit folgendermaßen konvertieren

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

So konvertieren Sie ein Datum in einer Zeichenfolge in verschiedene Formate.

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
Nick
quelle
24

Andere als die Verwendung von Zeit / Datumzeit - Paket, Pandas können auch die gleiche problem.Here zu lösen verwendet werden , wie wir sie verwenden können Pandas zu konvertieren Zeitstempel zu lesbares Datum :

Zeitstempel können in zwei Formaten vorliegen:

  1. 13 Ziffern (Millisekunden) - Um Millisekunden in das Datum umzuwandeln , verwenden Sie:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 Ziffern (Sekunden) - Um Sekunden in Datum umzuwandeln , verwenden Sie:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'
Shubham
quelle
Ein weiterer Sieg für Pandas, wie es scheint - das Modul ist in allem fantastisch
Vaidøtas Ivøška
21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Holen Sie sich das lesbare Datum aus dem Zeitstempel mit der Uhrzeit. Sie können auch das Format des Datums ändern.

Rishabh Jhalani
quelle
5
Was fügt diese Antwort dieser Antwort hinzu?
Kocica
1
Bitte fügen Sie eine Warnung in Bezug auf das Problem der Annahme der lokalen Zeitzone hinzu. Best Practices bei der Programmierung bestehen darin, Zeitstempel als UTC-Zeiten anstelle lokaler Zeitstempel zu speichern. Dieses Beispiel oben gibt jedoch die falsche Zeit zurück, wenn die lokale Zeitzone nicht UTC ist.
Timothy C. Quinn
6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
itsaruns
quelle
6

Eine andere Möglichkeit, dies mit gmtime und der Formatfunktion zu tun;

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

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

h3xus
quelle
1

Ich habe gerade erfolgreich verwendet:

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

schnell und schmutzig ein Liner:

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

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

Gl
quelle
3
Oder genauer gesagt: '-'. Join (map (str, datetime.datetime.now (). Timetuple () [: 6])
Jelle Zijlstra
2
@ JelleZijlstra Eh, ich bevorzuge den Generatorausdruck gegenüber der Karte.
Crhodes
4
Was für ein Datumsformat ist "2013-5-5-1-9-43"? Ich habe dieses Format nirgendwo als gültige Darstellung eines Datums / einer Uhrzeit gesehen.
Madoki
Können Sie näher erläutern, was dies als ungültige Darstellung @madoki qualifiziert? meinst du nicht standard? Der Hauptvorteil gegenüber den meisten anderen Antworten besteht in der Möglichkeit, sie in einen Datei- oder Verzeichnispfad aufzunehmen, da Leerzeichen und Doppelpunkte nicht in den Standardzeichen des Unix-Verzeichnisses enthalten sind. siehe z. B. stackoverflow.com/a/458001/209246
eqzx
0

Sie können easy_date verwenden , um es einfach zu machen:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
Raphael Amoedo
quelle
5
Jede Programmierung hat ihre eigenen Datums- und Zeitkonverter. Man sollte dafür niemals Mods / Frameworks verwenden müssen
JosFabre
strptimeund strftimeist nicht intuitiv ... und sogar nicht lesbar ... Aber ich verstehe und respektiere Ihre Meinung
Raphael Amoedo
4
Dass man "niemals benutzen muss", ist falsch. Dies hängt von der Sprache und der Qualität der integrierten Bibliotheken ab. Javascript hat Momente.js und Java hatten Joda-Zeit, die beide beliebter sind als die jeweiligen integrierten Konvertierungs-Utils für Datum und Uhrzeit (so sehr, dass die Joda-Zeit später die aktualisierten Standard-Bibliotheken von Java 8 beeinflusste). Das heißt, es sei denn, die Frage erfordert nette Bibliotheken von Drittanbietern, ist es vorzuziehen, eine Antwort basierend auf der Standardbibliothek zu geben.
Hejazzman
Ich stehe korrigiert @NikosVentouras. Ich hatte gerade das Problem "JS-Datum im IE verhält sich anders" zum ersten Mal. Also habe ich moment.js
JosFabre