2921 Stimmen

Konvertierung von String in Datetime

Wie konvertiere ich die folgende Zeichenfolge in ein Datetime-Objekt?

"Jun 1 2005  1:33PM"

51voto

Janus Troelsen Punkte 19028

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

39voto

jjm Punkte 443

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í

34voto

Alexander Punkte 96032

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

34voto

user1767754 Punkte 20816

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.

25voto

Aram Kocharyan Punkte 19721

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.com

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.

Powered by:

X