Frage Konvertieren von Zeichenfolge in datetime


Kurz und einfach. Ich habe eine riesige Liste von Datum-Zeiten wie diese als Strings:

Jun 1 2005  1:33PM
Aug 28 1999 12:00AM

Ich werde diese zurück in richtige Datetime-Felder in einer Datenbank schieben, also muss ich sie in echte Datetime-Objekte verwandeln.

Jede Hilfe (auch wenn es nur ein Kick in die richtige Richtung ist) wäre willkommen.

Edit: Dies geht durch Django ORM, so dass ich nicht SQL verwenden kann, um die Konvertierung beim Einfügen.


1458
2018-01-21 18:00


Ursprung


Antworten:


datetime.strptime ist die Hauptroutine zum Analysieren von Strings in Datumsangaben. Es kann alle Arten von Formaten verarbeiten, wobei das Format durch eine Formatzeichenfolge bestimmt wird, die Sie ihm geben:

from datetime import datetime

datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

Das Ergebnis datetime Objekt ist Zeitzonen-naiv.

Links:

Anmerkungen:

  • strptime = "parse time"
  • strftime = "Zeichenkettenformat Zeit"
  • Sprich es heute laut aus und du wirst es in 6 Monaten nicht mehr suchen müssen.

2396
2018-01-21 18:08



Verwenden Sie die dritte Partei Datum Bibliothek:

from dateutil import parser
dt = parser.parse("Aug 28 1999 12:00AM")

Es kann die meisten Datumsformate verarbeiten, einschließlich desjenigen, das Sie analysieren müssen. Es ist bequemer als die Zeit, da es meistens das richtige Format erraten kann.

Es ist sehr nützlich für das Schreiben von Tests, bei denen Lesbarkeit wichtiger ist als Leistung.

Sie können es installieren mit:

pip install python-dateutil

623
2018-01-22 18:27



Auschecken Ruhezeit in dem Zeit Modul. Es ist das Gegenteil von strftzeit.

$ python
>>> import time
>>> time.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
time.struct_time(tm_year=2005, tm_mon=6, tm_mday=1,
                 tm_hour=13, tm_min=33, tm_sec=0,
                 tm_wday=2, tm_yday=152, tm_isdst=-1)

460
2018-01-21 18:07



Ich habe ein Projekt zusammengestellt, das einige wirklich nette Ausdrücke umsetzen kann. Auschecken Zeitrahmen.

Hier einige Beispiele:

pip install timestring
>>> import timestring
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm')
<timestring.Date 2015-08-15 20:40:00 4491909392>
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date
datetime.datetime(2015, 8, 15, 20, 40)
>>> timestring.Range('next week')
<timestring.Range From 03/10/14 00:00:00 to 03/03/14 00:00:00 4496004880>
>>> (timestring.Range('next week').start.date, timestring.Range('next week').end.date)
(datetime.datetime(2014, 3, 10, 0, 0), datetime.datetime(2014, 3, 14, 0, 0))

87
2018-03-02 14:22



Denken Sie daran, und Sie mussten sich bei der Datetime-Konvertierung nicht erneut verwirren lassen.

String zu Datetime-Objekt = strptime

Datetime-Objekt zu anderen Formaten = strftime

Jun 1 2005 1:33PM

ist gleich

%b %d %Y %I:%M%p

% b Monat als abgekürzter Name des Gebietsschemas (Jun)

% d Tag des Monats als Nullstellenzahl (1)

% Y Jahr mit Jahrhundert als Dezimalzahl (2015)

% I Stunde (12-Stunden-Uhr) als Nullstellenzahl (01)

% M Minute als Nullstellenzahl (33)

% p Gebietsschema entspricht entweder AM oder PM (PM)

also brauchst du strptime i-e converting string zu

>>> dates = []
>>> dates.append('Jun 1 2005  1:33PM')
>>> dates.append('Aug 28 1999 12:00AM')
>>> from datetime import datetime
>>> for d in dates:
...     date = datetime.strptime(d, '%b %d %Y %I:%M%p')
...     print type(date)
...     print date
... 

Ausgabe

<type 'datetime.datetime'>
2005-06-01 13:33:00
<type 'datetime.datetime'>
1999-08-28 00:00:00

Was ist, wenn Sie ein anderes Datumsformat haben, können Sie panda oder dateutil.parse verwenden

>>> import dateutil
>>> dates = []
>>> dates.append('12 1 2017')
>>> dates.append('1 1 2017')
>>> dates.append('1 12 2017')
>>> dates.append('June 1 2017 1:30:00AM')
>>> [parser.parse(x) for x in dates]

Ausgabe

[datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 12, 0, 0), datetime.datetime(2017, 6, 1, 1, 30)]

33
2017-12-10 13:00



Viele Zeitstempel haben eine implizierte Zeitzone. Um sicherzustellen, dass Ihr Code in jeder Zeitzone funktioniert, sollten Sie UTC intern verwenden und eine Zeitzone jedes Mal anhängen, wenn ein Fremdobjekt in das System eindringt.

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

30
2018-03-06 11:53



Etwas, das hier nicht erwähnt wird und nützlich ist: Hinzufügen eines Suffix zum Tag. Ich entkoppelt die Suffix-Logik, so dass Sie sie für jede beliebige Zahl verwenden können, nicht nur für Daten.

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"))​​​​​​​

21
2017-10-14 00:13



Hier sind zwei Lösungen, die Pandas verwenden, um Daten, die als Zeichenfolgen formatiert sind, 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)]

Zeiten

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 hier ist, wie Sie die ursprünglichen Datum-Zeit-Beispiele des OP konvertieren:

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 check das Dokumente wenn Sie etwas Besonderes brauchen.

Ebenso haben Timestamps viele Eigenschaften und Methoden auf die zusätzlich zugegriffen werden kann .date


19
2017-12-20 03:03