wake-up-neo.com

Konvertieren eines Strings in Datum / Uhrzeit

Ich habe eine riesige Liste von Datums- und Uhrzeitangaben als Zeichenfolgen:

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

Ich werde diese in die richtigen Datums- und Uhrzeitfelder in einer Datenbank zurückschieben, damit ich sie in echte Datums- und Uhrzeitobjekte zaubern kann.

Dies geht durch Djangos ORM, so dass ich SQL nicht verwenden kann, um die Konvertierung beim Einfügen durchzuführen.

1953
Oli

datetime.strptime ist die Hauptroutine zum Parsen von Zeichenfolgen in Datumsangaben. Es kann alle Arten von Formaten verarbeiten, wobei das Format durch eine von Ihnen angegebene Formatzeichenfolge festgelegt wird:

from datetime import datetime

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

Das resultierende Objekt datetime ist zeitzonen-naiv.

Links:

  • Python-Dokumentation für strptime: Python 2 , Python

  • Python-Dokumentation für Zeichenfolgen im Format strptime/strftime: Python 2 , Python

  • strftime.org ist auch eine wirklich nette Referenz für die Strftime

Anmerkungen:

  • strptime = "String-Analysezeit"
  • strftime = "Zeichenfolgenformatierungszeit"
  • Sprechen Sie es heute laut aus und Sie müssen in 6 Monaten nicht mehr danach suchen.
3114

Verwenden Sie die Drittanbieter-Bibliothek dateutil :

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

Es kann die meisten Datumsformate verarbeiten, einschließlich des Formats, das Sie analysieren müssen. Es ist praktischer als strptime, da es die meiste Zeit das richtige Format erraten kann.

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

Sie können es installieren mit:

pip install python-dateutil
746
Simon Willison

Check out strptime im time Modul. Es ist das Gegenteil von strftime .

$ 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)
475
florin

Denken Sie daran, und Sie mussten sich bei der Konvertierung von Datum und Uhrzeit nicht erneut verwirren.

Zeichenfolge für Datum/Uhrzeit-Objekt = strptime

datum/Uhrzeit-Objekt in andere Formate = 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 mit Nullen aufgefüllte Dezimalzahl (1)

% Y Jahr mit Jahrhundert als Dezimalzahl (2015)

% I Hour (12-Stunden-Uhr) als mit Nullen aufgefüllte Dezimalzahl (01)

% M Minute als mit Nullen aufgefüllte Dezimalzahl (33)

% p Äquivalent des Gebietsschemas zu AM oder PM (PM)

sie brauchen also kurze Zeit, um string in umzuwandeln

>>> 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)]
44
Rizwan Mumtaz

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 Fremdobjekt in das System eindringt, 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)))
31
Janus Troelsen

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

Timings

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 konvertieren Sie die ursprünglichen Datum-Uhrzeit-Beispiele des OP:

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 zum Konvertieren von Zeichenfolgen in Pandas Zeitstempel mithilfe von to_datetime. Überprüfen Sie daher docs , wenn Sie etwas Besonderes benötigen.

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

25
Alexander

Etwas, das hier nicht erwähnt wird und nützlich ist: dem Tag ein Suffix hinzufügen. Ich habe die Suffix-Logik entkoppelt, damit Sie sie für eine beliebige Anzahl 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"))​​​​​​​
23
Aram Kocharyan

In Python> = 3.7.0

zum Konvertieren von JJJJ-MM-TT-Zeichenfolge in Datum/Uhrzeit-Objekt kann datetime.fromisoformat verwendet werden.

>>> from datetime import datetime

>>> date_string = "2012-12-12 10:10:10"
>>> print (datetime.fromisoformat(date_string))
>>> 2012-12-12 10:10:10
21
SuperNova

Ich persönlich mag die Lösung mit dem parser -Modul, das die zweite Antwort auf diese Frage ist und wunderschön ist, da Sie keine String-Literale erstellen müssen, um sie zum Laufen zu bringen. BUT, ein Nachteil ist, dass es 90% langsamer ist 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 eine Million Mal und immer wieder tun, halte ich die parser -Methode immer noch für praktischer und handhabbarer Die meiste Zeit wird automatisch formatiert.

21
user1767754

Beispiel für ein Django-Zeitzonen-Objekt mit Datum und Uhrzeit.

import datetime
from Django.utils.timezone import get_current_timezone
tz = get_current_timezone()

format = '%b %d %Y %I:%M%p'
date_object = datetime.datetime.strptime('Jun 1 2005  1:33PM', format)
date_obj = tz.localize(date_object)

Diese Konvertierung ist sehr wichtig für Django und Python, wenn Sie USE_TZ = True haben:

RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2016-03-04 00:00:00) while time zone support is active.
14
Ryu_hayabusa
In [34]: import datetime

In [35]: _now = datetime.datetime.now()

In [36]: _now
Out[36]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [37]: print _now
2016-01-19 09:47:00.432000

In [38]: _parsed = datetime.datetime.strptime(str(_now),"%Y-%m-%d %H:%M:%S.%f")

In [39]: _parsed
Out[39]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [40]: assert _now == _parsed
13
guneysus

für Unix/MySQL-Format 2018-10-15 20:59:29

from datetime import datetime

datetime_object = datetime.strptime('2018-10-15 20:59:29', '%Y-%m-%d %H:%M:%S')
12
Toskan

Erstellen Sie eine kleine Utility-Funktion wie:

def date(datestr="", format="%Y-%m-%d"):
    from datetime import datetime
    if not datestr:
        return datetime.today().date()
    return datetime.strptime(datestr, format).date()

Das ist vielseitig genug:

  • Wenn Sie keine Argumente übergeben, wird das heutige Datum zurückgegeben.
  • Standardmäßig gibt es ein Datumsformat, das Sie überschreiben können.
  • Sie können es einfach ändern, um eine Datums-/Uhrzeitangabe zurückzugeben.
10
Mackraken

Das Modul datetime Python eignet sich zum Abrufen der Datums- und Uhrzeitformate.

import datetime

new_date_format1 = datetime.datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
new_date_format2 = datetime.datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p').strftime('%Y/%m/%d %I:%M%p')
print new_date_format1
print new_date_format2

Ausgabe:

2005-06-01 13:33:00
2005/06/01 01:33PM
8
Rajiv Sharma

Der Pfeil bietet viele nützliche Funktionen für Datum und Uhrzeit. Dieses Codebit gibt eine Antwort auf die Frage und zeigt, dass der Pfeil Datumsangaben auf einfache Weise formatieren und Informationen für andere Gebietsschemata anzeigen kann.

>>> import arrow
>>> dateStrings = [ 'Jun 1  2005 1:33PM', 'Aug 28 1999 12:00AM' ]
>>> for dateString in dateStrings:
...     dateString
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').datetime
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').format('ddd, Do MMM YYYY HH:mm')
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').humanize(locale='de')
...
'Jun 1  2005 1:33PM'
datetime.datetime(2005, 6, 1, 13, 33, tzinfo=tzutc())
'Wed, 1st Jun 2005 13:33'
'vor 11 Jahren'
'Aug 28 1999 12:00AM'
datetime.datetime(1999, 8, 28, 0, 0, tzinfo=tzutc())
'Sat, 28th Aug 1999 00:00'
'vor 17 Jahren'

Siehe http://arrow.readthedocs.io/en/latest/ für mehr.

7
Bill Bell

Dies ist hilfreich für die Konvertierung von Zeichenfolgen in Datum und Uhrzeit sowie in Zeitzonen

def convert_string_to_time(date_string, timezone):
    from datetime import datetime
    import pytz
    date_time_obj = datetime.strptime(date_string[:26], '%Y-%m-%d %H:%M:%S.%f')
    date_time_obj_timezone = pytz.timezone(timezone).localize(date_time_obj)

    return date_time_obj_timezone

date = '2018-08-14 13:09:24.543953+00:00'
TIME_ZONE = 'UTC'
date_time_obj_timezone = convert_string_to_time(date, TIME_ZONE)
6
Kanish Mathew

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

import date_converter
converted_date = date_converter.string_to_datetime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
5
Raphael Amoedo

Wenn Sie nur das Datumsformat möchten, können Sie es manuell konvertieren, indem Sie Ihre einzelnen Felder wie folgt übergeben:

>>> import datetime
>>> date = datetime.date(int('2017'),int('12'),int('21'))
>>> date
datetime.date(2017, 12, 21)
>>> type(date)
<type 'datetime.date'>

Sie können Ihre geteilten Zeichenfolgewerte übergeben, um sie in einen Datumstyp zu konvertieren, wie beispielsweise:

selected_month_rec = '2017-09-01'
date_formate = datetime.date(int(selected_month_rec.split('-')[0]),int(selected_month_rec.split('-')[1]),int(selected_month_rec.split('-')[2]))

Sie erhalten den resultierenden Wert im Datumsformat.

3
Javed

Sie könnten auch Facebooks Entlein verwenden.

Probieren Sie es hier online aus: https://duckling.wit.ai/

Es gibt einen Python-Wrapper für die Bibliothek: pip install duckling

Es unterstützt viel mehr als nur Zeitanalyse.

0
Domi W
emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")
emp.info()

es werden die Spalten "Start Date Time" und "Last Login Time" angezeigt. Beide sind "object = strings" im Datenrahmen

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null object

Last Login Time      1000 non-null object
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: float64(1), int64(1), object(6)
memory usage: 62.6+ KB

Indem Sie die Option parse_dates in read_csv erwähnen, können Sie Ihre Zeichenfolge datetime in das Format pandas datetime konvertieren.

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv", parse_dates=["Start Date", "Last Login Time"])
emp.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null datetime64[ns]
Last Login Time      1000 non-null datetime64[ns]
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: datetime64[ns](2), float64(1), int64(1), object(4)
memory usage: 62.6+ KB
0
Riz.Khan