String in datetime konvertieren

2181

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

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

Ich werde diese zurück in die richtigen Datums- / Uhrzeitfelder in einer Datenbank schieben, damit ich sie in echte Datums- / Uhrzeitobjekte verwandeln kann.

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

Oli
quelle
6
Es sei denn, Sie sind sicher, dass ein Format jede einzelne Datums- und Uhrzeitangabe verarbeitet (kein '', keine NaNs, keine unvollständigen, keine Formatfehlanpassungen, keine nachgestellten Zeichen, Zeitzonen, Mikrosekunden-Zeitstempel oder anderer Text ...), das Ausnahmeglück von strptime()wird Sie verrückt machen, es sei denn, Sie wickeln es. Siehe meine Antwort, basierend auf der Antwort von Or Weis
smci
Der faulste und am weitesten verbreitete Ansatz, den ich kenne, ist Dateparser ( siehe blog.scrapinghub.com/2015/11/09/… ). Es funktioniert sogar mit Zeitausdrücken in natürlicher Sprache in mehreren Sprachen. Ich denke, es kann langsam sein.
Armando
Hier gibt es einen hilfreichen Link: stackabuse.com/converting-strings-to-datetime-in-python
GoingMyWay

Antworten:

3460

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

from datetime import datetime

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

Das resultierende datetimeObjekt ist zeitzonen-naiv.

Links:

Anmerkungen:

  • strptime = "String-Analysezeit"
  • strftime = "Zeichenfolgenformatzeit"
  • Sprechen Sie es heute laut aus und Sie müssen in 6 Monaten nicht mehr danach suchen.
Patrick Harrington
quelle
7
'% b', '% p' ​​kann in einem nicht englischen Gebietsschema fehlschlagen.
JFS
15
@ Benutzer Sie müssen im Voraus wissen, um diesen Teil der Formatzeichenfolge auszuschließen, aber wenn Sie eine dateanstelle von a möchten datetime, geht das gut durch datetime: datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
Izkata
14
Wenn Sie wissen, dass die Zeichenfolge eine Datums- / Uhrzeitangabe in UTC darstellt, können Sie ein zeitzonenbewusstes datetimeObjekt erhalten, indem Sie diese Zeile in Python 3 hinzufügen:from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
Flimm
111
Ich suchte"%Y-%m-%d %H:%M:%S"
Martin Thoma
4
@AminahNuraini Ich habe ein ähnliches Problem umgangen, indem ich es getan habe, from datetime import datetimeanstatt nur import datetime.
Max Strater
831

Verwenden Sie die Dateutil- Bibliothek eines Drittanbieters :

from dateutil import parser
parser.parse("Aug 28 1999 12:00AM")  # datetime.datetime(1999, 8, 28, 0, 0)

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

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

Sie können es installieren mit:

pip install python-dateutil
Simon Willison
quelle
86
Beachten Sie, dass dies für große Datenmengen möglicherweise nicht der optimale Weg ist, um das Problem anzugehen. Das Format jedes Mal zu erraten kann schrecklich langsam sein.
Paweł Polewicz
14
Das ist schön, aber es wäre schön, eine integrierte Lösung zu haben, anstatt sich an einen Dritten wenden zu müssen.
Brian Buck
1
Wenn ich versuche, "32. Januar" zu analysieren, wird "2032-01-06" zurückgegeben. Dies ist falsch.
Gibt
6
@ Reef: 5 mal so langsam nach meinem schnellen und schmutzigen Benchmark. Nicht so schrecklich langsam, wie ich es erwarten würde.
Antony Hatchkins
2
Hat seine eigenen Probleme - wie zum Beispiel das stille Löschen von Zeitzoneninformationen aus Zeiten: Versuchen Sie es mit parser.parse ('15: 55EST ') und vergleichen Sie es mit parser.parse ('15 .55CST') als Beispiel
F1Rumors
490

Schauen Sie sich strptime im Zeitmodul. Es ist die Umkehrung der Zeit .

$ python
>>> import time
>>> my_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)

timestamp = time.mktime(my_time)
# convert time object to datetime
from datetime import datetime
my_datetime = datetime.fromtimestamp(timestamp)
# convert time object to date
from datetime import date
my_date = date.fromtimestamp(timestamp)
Gulden
quelle
16
Soweit ich weiß, gibt diese Antwort nur Zeitobjekte aus, keine Datums- / Uhrzeitobjekte - weshalb die Antwort im Vergleich zu Patricks Antwort vergraben wäre.
Alexander Bird
Gibt es eine Möglichkeit, das Standard-Datums- / Uhrzeitformat des DateTimeField festzulegen?
Kingpin
3
Wie Alexander sagte, gibt dies eine struct_time zurück, keine datetime. Natürlich können Sie es in eine Datum / Uhrzeit konvertieren, aber Patricks Antwort ist einfacher, wenn Sie am Ende ein Datum / Uhrzeit-Objekt möchten.
Leandro Alves
Es gibt nichts Besseres als strtotime in der Standard-Python-Bibliothek, aber dateutil verfügt über einen Parser, der viele Best-Effort-Datumsformate erkennt.
Geoff Gerrietts
1
@BenBlank: '% b', '% p' ​​kann in einem nicht englischen Gebietsschema fehlschlagen.
JFS
113

Ich habe ein Projekt zusammengestellt, das einige wirklich nette Ausdrücke konvertieren kann. Überprüfen Sie die Zeitleiste .

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))
Steve Peak
quelle
2
Beeindruckend. Beeindruckend. Beeindruckend. Beeindruckend. Das ist so einfach. Ich habe eine Datums- / Uhrzeitzeichenfolge und möchte nur das Jahr herausziehen. So einfach wie: import timestring timestring.Date('27 Mar 2014 12:32:29 GMT').yearDiese Bibliothek hat es so einfach gemacht! Vielen Dank.
Brandonjp
Gern geschehen. Ich würde mich über Ihre Kommentare und Ideen zur Verbesserung dieses Pakets freuen. Lassen Sie mich wissen, verwenden Sie Github-Probleme. Vielen Dank!
Steve Peak
Hallo Steve, das Modul ist großartig. Wäre schön, auch ein String-Attribut für Wochentage zu haben. Ansonsten nicht sicher, ob Sie von Montag oder Sonntag beginnen
Anake
1
Es werden Konvertierungen wie "5. Februar 2017" und "5. Februar 2017" nicht ordnungsgemäß konvertiert (in einigen Kreisen beliebte Formate und IMO einige der besten Datumsformate für Klarheit und Lesbarkeit). Es speichert sie als 2017-02-01. Gleiches gilt für den 5. Februar 2017 (der 5. Februar 2017 ist jedoch korrekt). Keines der beiden letzten Formate ist meines Wissens nach ein gewohntes Format, aber ich dachte, ich würde trotzdem darauf hinweisen.
Brōtsyorfuzthrāx
2
WARNUNG: Dieses Paket scheint in den letzten 5 Jahren zu keinem Zeitpunkt gewartet oder verbessert worden zu sein und analysiert routinemäßig offensichtlich falsche Daten. Wenn Sie beispielsweise instanziieren, wird Date("20180912")ein Wert von analysiert 2018-11-21. Benutzung auf eigene Gefahr.
bsplosion
54

Denken Sie daran, und Sie mussten bei der Datums- / Uhrzeitkonvertierung nicht erneut verwirrt werden.

Zeichenfolge zum Datum / Uhrzeit-Objekt = strptime

datetime Objekt in 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 null aufgefüllte Dezimalzahl (1)

% Y Jahr mit Jahrhundert als Dezimalzahl (2015)

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

% M Minute als null aufgefüllte Dezimalzahl (33)

% p Das Gebietsschema entspricht entweder AM oder PM (PM)

Sie benötigen also Strptime, dh Konvertieren stringin

>>> 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? Sie können 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)]
Rizwan Mumtaz
quelle
% S für Sekunden als Dezimal
Optimist
1
Wird nicht %bunterbrochen, wenn Sie ein englisches Datum auf einem Computer analysieren, der kein englisches Gebietsschema hat?
Bfontaine
48

In Python> = 3.7.0,

zu konvertieren YYYY-MM-DD String in Datetime - Objekt , datetime.fromisoformatkönnte 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
SuperNova
quelle
32

Viele Zeitstempel haben eine implizite Zeitzone. Um sicherzustellen, dass Ihr Code in jeder Zeitzone funktioniert, sollten Sie UTC intern verwenden und bei jedem Eintritt eines Fremdkörpers in das System eine Zeitzone anhängen.

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)))
Janus Troelsen
quelle
3
Warum behalten Sie die hässliche und manchmal falsche ( mktime()während der Sommerzeitübergänge) 1. Methode bei, wenn Sie die 2. Methode kennen ( datetime.strptime())? Wenn Sie eine Ausnahme während einer calendar.timegm(datetime(1970,1,1)+timedelta(seconds=timegm(time.strptime(..)))).replace(tzinfo=timezone(timedelta(-3)))
jfs
29

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 Beispiele für Datum und Uhrzeit 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 mit to_datetime. Überprüfen Sie daher die Dokumente, wenn Sie etwas Besonderes benötigen.

Ebenso verfügen Zeitstempel über viele Eigenschaften und Methoden , auf die zusätzlich zugegriffen werden kann.date

Alexander
quelle
26

Ich persönlich mag die Lösung mit dem parserModul, das die zweite Antwort auf diese Frage ist und wunderschön ist, da Sie keine String-Literale erstellen müssen, damit es funktioniert. ABER 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 millionenfach tun , denke ich immer noch, dass die parserMethode bequemer ist und die meisten Zeitformate automatisch verarbeitet.

user1767754
quelle
24

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 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"))​​​​​​​
Aram Kocharyan
quelle
17
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
Guneysos
quelle
16

Beispiel für ein Django-Zeitzonen-fähiges Datum / Uhrzeit-Objekt.

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 für Django und Python sehr wichtig, wenn Sie USE_TZ = True:

RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2016-03-04 00:00:00) while time zone support is active.
Ryu_hayabusa
quelle
12

Erstellen Sie eine kleine Dienstprogrammfunktion 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 leicht ändern, um eine Datums- / Uhrzeitangabe zurückzugeben.
Mackraken
quelle
2
formatist ein reserviertes Wort in Python und sollte nicht als Variablenname verwendet werden.
Zerkleinern
12

Dies ist hilfreich für die Konvertierung von Zeichenfolgen in datetime und auch in die Zeitzone

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)
Kanish Mathew
quelle
9

Pfeil bietet viele nützliche Funktionen für Datum und Uhrzeit. Dieses Codebit gibt eine Antwort auf die Frage und zeigt, dass der Pfeil auch Daten einfach formatieren und Informationen für andere Gebietsschemas 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'

Weitere Informationen finden Sie unter http://arrow.readthedocs.io/en/latest/ .

Bill Bell
quelle
6

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')
Raphael Amoedo
quelle
4

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 Zeichenfolgenwerte übergeben, um sie wie folgt in einen Datumstyp zu konvertieren:

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.

Javed
quelle
2

Sie können auch auschecken dateparser

dateparser bietet Module zum einfachen Parsen lokalisierter Daten in nahezu allen auf Webseiten üblichen Zeichenfolgenformaten.

Installieren:

$ pip install dateparser

Ich denke, dies ist der einfachste Weg, um Daten zu analysieren.

Am einfachsten ist es, die dateparser.parseFunktion zu verwenden, die den größten Teil der Funktionalität des Moduls umfasst.

Beispielcode:

import dateparser

t1 = 'Jun 1 2005  1:33PM'
t2 = 'Aug 28 1999 12:00AM'

dt1 = dateparser.parse(t1)
dt2 = dateparser.parse(t2)

print(dt1)
print(dt2)

Ausgabe:

2005-06-01 13:33:00
1999-08-28 00:00:00
Bilesh Ganguly
quelle
1

Siehe meine Antwort .

In realen Daten ist dies ein echtes Problem: mehrere, nicht übereinstimmende, unvollständige, inkonsistente und mehrsprachige / regionale Datumsformate, die häufig frei in einem Datensatz gemischt werden. Es ist nicht in Ordnung, dass Produktionscode fehlschlägt, geschweige denn wie ein Fuchs ausnahmefreudig wird.

Wir müssen versuchen, ... mehrere Datums- / Uhrzeitformate fmt1, fmt2, ..., fmtn abzufangen und die Ausnahmen (von strptime()) für alle zu unterdrücken / zu behandeln, die nicht übereinstimmen (und insbesondere zu vermeiden, dass eine yukky n-tief eingerückte Versuchsleiter benötigt wird ..catch-Klauseln). Aus meiner Lösung

def try_strptime(s, fmts=['%d-%b-%y','%m/%d/%Y']):
    for fmt in fmts:
        try:
            return datetime.strptime(s, fmt)
        except:
            continue

    return None # or reraise the ValueError if no format matched, if you prefer
smci
quelle
Die Frage sagte nichts über "mehrere, nicht übereinstimmende, unvollständige, inkonsistente und mehrsprachige / regionale Datumsformate" usw. aus. Dies mag ein echtes Problem sein, ist hier jedoch nicht relevant.
RoG
1
@RoG: Es wurde nie gesagt, dass dies nicht der Fall ist, und es wurde impliziert, dass es sich um eine "riesige Liste ... Datenbank" handelt . In fast jeder Datenbank / Protokolldatei, an der ich gearbeitet habe (auch in kleinen Formaten), gab es mehrere Datumsformate, Zeitzonen-IDs, MM-DD usw. In der Produktion ist es nicht akzeptabel, spröden Code zu schreiben, der in Formaten fest codiert und mit Ausnahme von Abstürzen Es erhält nicht das erwartete Format (selbst die Rückgabe von None oder '' ist akzeptabler). Daher sind mehrere Formate erforderlich. Daher wird hier die gestellte Frage beantwortet, und ich habe ein wenig Zeit damit verbracht, herauszufinden, wie Pythons in mehreren Formaten am besten behandelt werden können.
smci
"riesige Liste ... Datenbank" impliziert einfach, dass es viele von ihnen gibt, nicht dass sie alle unterschiedliche Formate haben. Es ist völlig akzeptabel, Code zu schreiben, der ein einzelnes Format liest, wenn Sie wissen, dass die Eingabe ein einzelnes Format enthält. In diesem Fall sollte es abstürzen, wenn etwas übergeben wird, das nicht das richtige Format hat.
RoG
@RoG: Es ist nicht akzeptabel, Produktionscode zu schreiben, der bei falschem Format / verstümmeltem Unicode / abgeschnitten / fehlenden / Daten, NaNs, M / D / Y gegen D / M / Y-Format, YY gegen YYYY usw. abstürzt Ausnahmen können mit einer Sieben-Linien-Lösung vermieden werden, wie ich gezeigt habe. Die meisten realen "riesigen Datenbanken" sind so. Nur weil das OP nicht ausdrücklich gesagt hat, heißt das nicht, dass es nicht der typische Kontext ist. Ich werde nicht mit dir streiten. An welcher Art von Datensätzen arbeiten Sie und warum halten Sie diese Annahmen für angemessen? Es sei denn, es handelt sich nur um Spielzeugcode, der ein ständiges Eingreifen erfordert.
smci
1
Es scheint ein bisschen dumm, mit absoluter Sicherheit anzunehmen, dass das OP Daten haben muss, die niemals Inkonsistenzen aufweisen. Ja, es ist möglich, solche Daten zu haben, aber nein, wir können hier nicht davon ausgehen, dass dies der Fall ist. Ich fand diese Antwort nützlich, sicherlich für mich, deren Suche nach ähnlichen Antworten auf eine sehr ähnliche Frage, bei der Inkonsistenzen definitiv ein Problem darstellen.
Paul Miller
1
emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")
emp.info()

Es zeigt die Spalte "Startdatum Uhrzeit" und "Letzte Anmeldezeit". Beide sind "Objekt = Zeichenfolgen" 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

Mit der oben genannten parse_datesOption read_csvkönnen Sie Ihre Zeichenfolge datetime in das pandas datetime-Format 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
Riz.Khan
quelle