Wie konvertiere ich die folgende Zeichenfolge in ein Datetime-Objekt?
"Jun 1 2005 1:33PM"
Wie konvertiere ich die folgende Zeichenfolge in ein Datetime-Objekt?
"Jun 1 2005 1:33PM"
Viele Zeitstempel haben eine implizite Zeitzone. Um sicherzustellen, dass Ihr Code in jeder Zeitzone funktioniert, sollten Sie intern UTC verwenden und jedes Mal, wenn ein fremdes Objekt in das System gelangt, eine Zeitzone hinzufügen.
Python 3.2+:
>>> datetime.datetime.strptime(
... "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))
Dies setzt voraus, dass Sie den Offset kennen. Wenn Sie das nicht tun, aber z. B. den Ort kennen, können Sie die Funktion pytz
Paket zur Abfrage der IANA-Zeitzonendatenbank für den Ausgleich. Ich nehme hier Teheran als Beispiel, weil es einen halbstündigen Offset hat:
>>> tehran = pytz.timezone("Asia/Tehran")
>>> local_time = tehran.localize(
... datetime.datetime.strptime("March 5, 2014, 20:13:50",
... "%B %d, %Y, %H:%M:%S")
... )
>>> local_time
datetime.datetime(2014, 3, 5, 20, 13, 50, tzinfo=<DstTzInfo 'Asia/Tehran' +0330+3:30:00 STD>)
Wie Sie sehen können, pytz
hat festgestellt, dass die Verschiebung zu diesem Zeitpunkt +3:30 betrug. Sie können dies nun in UTC-Zeit umwandeln, und die Verschiebung wird angewendet:
>>> utc_time = local_time.astimezone(pytz.utc)
>>> utc_time
datetime.datetime(2014, 3, 5, 16, 43, 50, tzinfo=<UTC>)
Beachten Sie, dass Daten, die vor der Einführung von Zeitzonen liegen, zu seltsamen Verschiebungen führen. Das liegt daran, dass die IANA beschlossen hat, die Lokale Mittelzeit :
>>> chicago = pytz.timezone("America/Chicago")
>>> weird_time = chicago.localize(
... datetime.datetime.strptime("November 18, 1883, 11:00:00",
... "%B %d, %Y, %H:%M:%S")
... )
>>> weird_time.astimezone(pytz.utc)
datetime.datetime(1883, 11, 18, 7, 34, tzinfo=<UTC>)
Die seltsamen "7 Stunden und 34 Minuten" ergeben sich aus dem Längengrad von Chicago. Ich habe diesen Zeitstempel verwendet, weil er direkt vor Die standardisierte Zeit wurde in Chicago eingeführt. .
Wenn Ihre Zeichenkette im ISO8601-Format ist und Sie Python 3.7+ haben, können Sie den folgenden einfachen Code verwenden:
import datetime
aDate = datetime.date.fromisoformat('2020-10-04')
für Termine und
import datetime
aDateTime = datetime.datetime.fromisoformat('2020-10-04 22:47:00')
für Zeichenketten mit Datum und Uhrzeit. Wenn Zeitstempel enthalten sind, wird die Funktion datetime.datetime.isoformat()
unterstützt das folgende Format
YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
wobei *
passt auf jedes einzelne Zeichen. Siehe auch aquí y aquí
Hier sind zwei Lösungen, die Pandas verwenden, um als Strings formatierte Daten in datetime.date-Objekte zu konvertieren.
import pandas as pd
dates = ['2015-12-25', '2015-12-26']
# 1) Use a list comprehension.
>>> [d.date() for d in pd.to_datetime(dates)]
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]
# 2) Convert the dates to a DatetimeIndex and extract the python dates.
>>> pd.DatetimeIndex(dates).date.tolist()
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]
Zeitangaben
dates = pd.DatetimeIndex(start='2000-1-1', end='2010-1-1', freq='d').date.tolist()
>>> %timeit [d.date() for d in pd.to_datetime(dates)]
# 100 loops, best of 3: 3.11 ms per loop
>>> %timeit pd.DatetimeIndex(dates).date.tolist()
# 100 loops, best of 3: 6.85 ms per loop
Und so konvertiert man die ursprünglichen Datums-Zeit-Beispiele des Auftraggebers:
datetimes = ['Jun 1 2005 1:33PM', 'Aug 28 1999 12:00AM']
>>> pd.to_datetime(datetimes).to_pydatetime().tolist()
[datetime.datetime(2005, 6, 1, 13, 33),
datetime.datetime(1999, 8, 28, 0, 0)]
Es gibt viele Optionen für die Konvertierung von Strings in Pandas Timestamps mit to_datetime
also überprüfen Sie die docs wenn Sie etwas Besonderes brauchen.
Gleichermaßen haben Zeitstempel viele Eigenschaften und Methoden auf die man zusätzlich zu den .date
Mir persönlich gefällt die Lösung mit dem parser
Modul, das die zweite Antwort auf diese Frage ist und sehr schön ist, da man keine String-Literale konstruieren muss, damit es funktioniert. BUT Ein Nachteil ist, dass es sich 90% langsamer als die akzeptierte Antwort mit strptime
.
from dateutil import parser
from datetime import datetime
import timeit
def dt():
dt = parser.parse("Jun 1 2005 1:33PM")
def strptime():
datetime_object = datetime.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p')
print(timeit.timeit(stmt=dt, number=10**5))
print(timeit.timeit(stmt=strptime, number=10**5))
>10.70296801342902
>1.3627995655316933
Solange Sie dies nicht tun eine Million immer und immer wieder, ich denke immer noch, dass die parser
Methode ist bequemer und wird die meisten Zeitformate automatisch verarbeiten.
Etwas, das hier nicht erwähnt wird und nützlich ist: das Hinzufügen eines Suffixes zum Tag. Ich habe die Suffix-Logik entkoppelt, sodass Sie sie für jede beliebige Zahl verwenden können, nicht nur für Datumsangaben.
import time
def num_suffix(n):
'''
Returns the suffix for any given int
'''
suf = ('th','st', 'nd', 'rd')
n = abs(n) # wise guy
tens = int(str(n)[-2:])
units = n % 10
if tens > 10 and tens < 20:
return suf[0] # teens with 'th'
elif units <= 3:
return suf[units]
else:
return suf[0] # 'th'
def day_suffix(t):
'''
Returns the suffix of the given struct_time day
'''
return num_suffix(t.tm_mday)
# Examples
print num_suffix(123)
print num_suffix(3431)
print num_suffix(1234)
print ''
print day_suffix(time.strptime("1 Dec 00", "%d %b %y"))
print day_suffix(time.strptime("2 Nov 01", "%d %b %y"))
print day_suffix(time.strptime("3 Oct 02", "%d %b %y"))
print day_suffix(time.strptime("4 Sep 03", "%d %b %y"))
print day_suffix(time.strptime("13 Nov 90", "%d %b %y"))
print day_suffix(time.strptime("14 Oct 10", "%d %b %y"))
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.