2921 Stimmen

Konvertierung von String in Datetime

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

"Jun 1 2005  1:33PM"

3voto

Wenn Sie don't wollen explicitly specify dont format Ihre Zeichenkette in Bezug auf das Datums- und Zeitformat ist, können Sie Folgendes verwenden hack to by pass that step :-

from dateutil.parser import parse

# function that'll guess the format and convert it into python datetime format
def update_event(start_datetime=None, end_datetime=None, description=None):
    if start_datetime is not None:
        new_start_time = parse(start_datetime)

        return new_start_time

#sample input dates in different format
d = ['06/07/2021 06:40:23.277000','06/07/2021 06:40','06/07/2021']

new = [update_event(i) for i in d]

for date in new:
    print(date)
    # sample output dates in python datetime object
    # 2014-04-23 00:00:00
    # 2013-04-24 00:00:00
    # 2014-04-25 00:00:00

Wenn Sie es in ein anderes Datumsformat konvertieren möchten, ändern Sie einfach die letzte Zeile mit dem gewünschten Format, z. B. so etwas wie date.strftime('%Y/%m/%d %H:%M:%S.%f') :-

from dateutil.parser import parse

def update_event(start_datetime=None, end_datetime=None, description=None):
    if start_datetime is not None:
        new_start_time = parse(start_datetime)

        return new_start_time

#sample input dates in different format
d = ['06/07/2021 06:40:23.277000','06/07/2021 06:40','06/07/2021']

# passing the dates one by one through the function
new = [update_event(i) for i in d]

for date in new:
    print(date.strftime('%Y/%m/%d %H:%M:%S.%f'))
    # sample output dates in required python datetime object
    #2021/06/07 06:40:23.277000
    #2021/06/07 06:40:00.000000
    #2021/06/07 00:00:00.000000

Versuchen Sie, das obige Snipet auszuführen, um mehr Klarheit zu erhalten. Danke

2voto

Riz.Khan Punkte 348
emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")
emp.info()

Die Spalten "Startdatum Zeit" und "Letzte Anmeldezeit" sind beide "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

Durch die Verwendung von parse_dates オプションで read_csv können Sie Ihren String 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

2voto

John Forbes Punkte 1118

Ein kurzes Beispiel, das eine Datumszeichenfolge yyyy-mm-dd auf ein datetime.date-Objekt abbildet:

from datetime import date
date_from_yyyy_mm_dd = lambda  : date(*[int(_) for _ in .split('-')])
date_object = date_from_yyyy_mm_dd('2021-02-15')

2voto

smci Punkte 29317

Voir meine Antwort .

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

Wir müssen versuchen...mehrere Datumsformate fmt1,fmt2,...,fmtn abzufangen und die Ausnahmen zu unterdrücken/behandeln (von strptime() ) für alle diejenigen, die nicht übereinstimmen (und insbesondere vermeiden, dass eine eklige n-tief eingerückte Leiter von try..catch-Klauseln benötigt wird). Von meine 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

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