Konwertowanie ciągu na datę i godzinę

2178

Mam ogromną listę dat, takich jak ciągi znaków:

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

Zamieszczę je z powrotem w odpowiednie pola daty i godziny w bazie danych, więc muszę je magicznie przekształcić w prawdziwe obiekty datetime.

Przechodzi przez ORM Django, więc nie mogę użyć SQL do konwersji na insert.

Oli
źródło
6
O ile nie masz pewności, że jeden format obsługuje każdą datę i godzinę (no '', brak NaN, brak niekompletności, brak niedopasowania formatu, brak końcowych znaków, stref czasowych, mikrosekundowych znaczników czasu lub innego tekstu ...), wyjątek - szczęście strptime()doprowadzi cię do szału, chyba że go owiniesz. Zobacz moją odpowiedź na podstawie odpowiedzi Or Weis na ten temat
smci
Najbardziej leniwym i najczęściej używanym podejściem, jakie znam, jest dateparser (sprawdź blog.scrapinghub.com/2015/11/09/… ). Działa nawet z wyrażeniami czasu języka naturalnego w kilku językach od razu po wyjęciu z pudełka. Myślę, że może to być powolne.
Armando
Tutaj jest przydatny link: stackabuse.com/converting-strings-to-datetime-in-python
GoingMyWay

Odpowiedzi:

3456

datetime.strptimejest główną procedurą do analizowania ciągów w czasie danych. Może obsługiwać wszystkie rodzaje formatów, przy czym format określa ciąg formatu, który mu podasz:

from datetime import datetime

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

Powstały datetimeobiekt jest naiwny dla strefy czasowej.

Spinki do mankietów:

Uwagi:

  • strptime = "ciąg parsowania czasu"
  • strftime = „czas formatu ciągu”
  • Wypowiedz to dziś na głos, a nie będziesz musiał jej szukać ponownie za 6 miesięcy.
Patrick Harrington
źródło
7
„% b”, „% p” może zawieść w ustawieniach innych niż angielski.
jfs
15
@ Użytkownik Musisz wiedzieć z wyprzedzeniem, aby wykluczyć tę część ciągu formatu, ale jeśli chcesz datezamiast datetime, datetimeto dobrze go sobie radzi: datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
Izkata,
14
Jeśli wiesz, że ciąg reprezentuje datę i godzinę w UTC, możesz uzyskać datetimeobiekt świadomy strefy czasowej, dodając ten wiersz w Pythonie 3:from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
Flimm
111
Szukałem"%Y-%m-%d %H:%M:%S"
Martin Thoma,
4
@AminahNuraini Poradziłem sobie z podobnym problemem, robiąc from datetime import datetimezamiast po prostu import datetime.
Max Strater,
831

Użyj biblioteki dateutil innej firmy :

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

Obsługuje większość formatów dat, w tym ten, który musisz przeanalizować. Jest to wygodniejsze niż strptimemoże przez większość czasu odgadnąć właściwy format.

Jest to bardzo przydatne do pisania testów, w których czytelność jest ważniejsza niż wydajność.

Możesz go zainstalować za pomocą:

pip install python-dateutil
Simon Willison
źródło
86
Należy pamiętać, że w przypadku dużych ilości danych może to nie być najbardziej optymalny sposób podejścia do problemu. Odgadywanie formatu za każdym razem może być strasznie wolne.
Paweł Polewicz
14
Jest to miłe, ale fajnie byłoby mieć wbudowane rozwiązanie zamiast iść do strony trzeciej.
brian buck
1
Kiedy próbuję parsować „32nd Jan”, zwraca mi „2032-01-06” .. co jest niepoprawne. jest jakiś sposób, aby sprawdzić, czy ciąg jest prawidłową datą, czy nie
Kartik Domadiya
6
@ Reef: 5 razy wolniej, zgodnie z moim szybkim i brudnym testem porównawczym. Nie tak strasznie powolny, jak bym się spodziewał.
Antony Hatchkins
2
Ma swoje własne problemy - jak na przykład dyskretne usuwanie informacji o strefie czasowej z czasów: spróbuj parser.parse ('15: 55EST ') i porównaj z parser.parse ('15 .55CST') jako przykład
F1Rumors
490

Sprawdź strptime w module czasu . To jest odwrotność strftime .

$ 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)
florin
źródło
16
Z tego, co rozumiem, ta odpowiedź generuje tylko obiekty czasu, a nie obiekty datetime - dlatego odpowiedź byłaby zakopana w porównaniu z odpowiedzią Patricka.
Alexander Bird
Czy istnieje sposób ustawienia domyślnego formatu daty i godziny DateTimeField?
kingpin
3
Jak powiedział Alexander, zwraca to parametr struct_time, a nie datetime. Oczywiście możesz przekonwertować go na datę i godzinę, ale odpowiedź Patricka jest bardziej prosta, jeśli chcesz na końcu obiekt daty i godziny.
Leandro Alves,
W standardowej bibliotece Pythona nie ma nic takiego jak strtotime, ale dateutil ma parser, który rozpoznaje wiele formatów dat najlepszego wysiłku.
Geoff Gerrietts
1
@BenBlank: „% b”, „% p” może zawieść w ustawieniach innych niż angielski.
jfs
113

Przygotowałem projekt, który potrafi przekształcić niektóre naprawdę fajne wyrażenia. Sprawdź rozkład czasowy .

Oto kilka przykładów poniżej:

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
źródło
2
Łał. Łał. Łał. Łał. To takie proste. Mam ciąg datetime i chcę po prostu wyciągnąć rok. Tak proste: import timestring timestring.Date('27 Mar 2014 12:32:29 GMT').yearTa biblioteka sprawiła, że ​​było to TAK ŁATWE! Dziękuję Ci.
brandonjp
Nie ma za co. Chciałbym poznać twoje uwagi i pomysły dotyczące ulepszenia tego pakietu. Daj mi znać, użyj problemów z github. Dzięki!
Steve Peak
Cześć Steve, moduł jest świetny. Byłoby miło mieć również atrybut ciągu dnia tygodnia. W przeciwnym razie nie jestem pewien, czy zaczniesz od poniedziałku czy niedzieli
Anake
1
Nie konwertuje poprawnie takich jak „5 lutego 2017 r.” I „5 lutego 2017 r.” (Które są formatami popularnymi w niektórych kręgach, a IMO jedne z najlepszych formatów dat dla jasności i czytelności). Przechowuje je jako 2017-02-01. To samo dla 5 lutego 2017 r. (Jednak robi to poprawnie 5 lutego 2017 r.); żaden z tych dwóch ostatnich nie jest formatem, który kiedykolwiek widziałem przyzwyczajony do mojej wiedzy, ale pomyślałem, że i tak to zwrócę.
Brōtsyorfuzthrāx
2
OSTRZEŻENIE: Wygląda na to, że ten pakiet nie został utrzymany ani poprawiony w ciągu ostatnich 5 lat i rutynowo analizuje oczywiście nieprawidłowe daty. Na przykład tworzenie instancji w Date("20180912")jakiś sposób analizuje wartość 2018-11-21. Używaj na własne ryzyko.
bsplosion
54

Pamiętaj o tym i nie musiałeś się ponownie mylić podczas konwersji daty i godziny.

Ciąg do obiektu datetime = strptime

obiekt datetime do innych formatów = strftime

Jun 1 2005 1:33PM

jest równe

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

% b Miesiąc jako skrócona nazwa regionu (czerwiec)

% d Dzień miesiąca jako liczba dziesiętna uzupełniona zerami (1)

% Y Rok z wiekiem jako liczba dziesiętna (2015)

% I Godzina (zegar 12-godzinny) jako liczba dziesiętna uzupełniona zerami (01)

% M minuta jako liczba dziesiętna uzupełniona zerami (33)

% p Odpowiednik ustawień regionalnych AM lub PM (PM)

więc potrzebujesz strptime, czyli konwersji stringdo

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

Wynik

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

Co zrobić, jeśli masz inny format dat, możesz użyć panda lub dateutil.parse

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

Wynik

[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
źródło
% S na sekundy jako dziesiętny
optymista
1
Czy nie %bzłamie się, jeśli parsujesz angielską datę na maszynie, która nie ma angielskich ustawień regionalnych?
bfontaine
48

W Pythonie> = 3.7.0

Aby przekonwertować YYYY-MM-DD datetime ciąg do obiektu , datetime.fromisoformatmogą być wykorzystane.

>>> from datetime import datetime

>>> date_string = "2012-12-12 10:10:10"
>>> print (datetime.fromisoformat(date_string))
>>> 2012-12-12 10:10:10
SuperNova
źródło
32

Wiele znaczników czasu ma domyślną strefę czasową. Aby mieć pewność, że Twój kod będzie działał w każdej strefie czasowej, powinieneś używać UTC wewnętrznie i dołączać strefę czasową za każdym razem, gdy obcy obiekt wchodzi do systemu.

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
źródło
3
Dlaczego trzymasz brzydką, a czasem błędną ( mktime()podczas przejścia DST) pierwszą metodę, jeśli znasz drugą metodę ( datetime.strptime())? Jeśli chcesz uniknąć wyjątku podczas sekundy przestępnej (druga metoda zawodzi), możesz calendar.timegmzamiast tego użyć :(datetime(1970,1,1)+timedelta(seconds=timegm(time.strptime(..)))).replace(tzinfo=timezone(timedelta(-3)))
jfs
29

Oto dwa rozwiązania wykorzystujące Pandy do konwertowania dat sformatowanych jako ciągi na obiekty datetime.date.

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

Czasy

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

A oto jak przekonwertować oryginalne przykłady daty i godziny 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)]

Istnieje wiele opcji konwersji ciągów znaków za pomocą znaczników czasu Pandas to_datetime, więc sprawdź dokumenty, jeśli potrzebujesz czegoś specjalnego.

Podobnie znaczniki czasu mają wiele właściwości i metod, do których można uzyskać dostęp oprócz.date

Alexander
źródło
26

Osobiście podoba mi się rozwiązanie wykorzystujące parsermoduł, który jest drugą odpowiedzią na to pytanie i jest piękny, ponieważ nie trzeba budować żadnych literałów łańcuchowych, aby działało. ALE , jedną wadą jest to, że jest o 90% wolniejsza niż przyjęta odpowiedź 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

Tak długo, jak nie robisz tego milion razy, wciąż uważam, że parsermetoda jest wygodniejsza i automatycznie obsłuży większość formatów czasowych.

użytkownik1767754
źródło
24

Coś, co nie zostało tutaj wymienione i jest przydatne: dodanie sufiksu do dnia. Odsprzęgłem logikę sufiksu, abyś mógł używać jej do dowolnej liczby, a nie tylko dat.

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
źródło
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
guneysus
źródło
16

Przykład obiektu daty / godziny rozpoznającego strefę czasową Django.

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)

Ta konwersja jest bardzo ważna dla Django i Pythona, gdy masz 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
źródło
12

Utwórz małą funkcję narzędzia, taką jak:

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

Jest to wystarczająco wszechstronne:

  • Jeśli nie podasz żadnych argumentów, zwróci dzisiejszą datę.
  • Domyślnie istnieje format daty, który można zastąpić.
  • Możesz go łatwo zmodyfikować, aby zwrócić datę / godzinę.
Mackraken
źródło
2
formatjest zastrzeżonym słowem w pythonie i nie należy go używać jako nazwy zmiennej.
niszczenie
12

Przydałoby się to do konwersji ciągu na datę i godzinę, a także do strefy czasowej

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
źródło
9

strzałka oferuje wiele przydatnych funkcji dla dat i godzin. Ten fragment kodu stanowi odpowiedź na pytanie i pokazuje, że strzałka jest również w stanie łatwo formatować daty i wyświetlać informacje o innych lokalizacjach.

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

Zobacz http://arrow.readthedocs.io/en/latest/, aby uzyskać więcej.

Bill Bell
źródło
6

Aby ułatwić, możesz użyć easy_date :

import date_converter
converted_date = date_converter.string_to_datetime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
Raphael Amoedo
źródło
4

Jeśli chcesz tylko format daty, możesz go ręcznie przekonwertować, przekazując poszczególne pola, takie jak:

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

Możesz przekazać wartości podzielonego ciągu, aby przekonwertować go na typ daty, taki jak:

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

Otrzymasz wynikową wartość w formacie daty.

Javed
źródło
2

Możesz także sprawdzić dateparser

dateparser udostępnia moduły do ​​łatwego analizowania zlokalizowanych dat w prawie dowolnych formatach ciągów powszechnie spotykanych na stronach internetowych.

Zainstalować:

$ pip install dateparser

To, moim zdaniem, najłatwiejszy sposób na parsowanie dat.

Najprostszym sposobem jest użycie dateparser.parsefunkcji, która obejmuje większość funkcji modułu.

Przykładowy kod:

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)

Wynik:

2005-06-01 13:33:00
1999-08-28 00:00:00
Bilesh Ganguly
źródło
1

Zobacz moją odpowiedź .

W rzeczywistych danych jest to prawdziwy problem: wiele niedopasowanych, niekompletnych, niespójnych i wielojęzycznych formatów daty / regionu, często dowolnie mieszanych w jednym zbiorze danych. Nie jest w porządku, aby kod produkcyjny zawiódł, nie mówiąc już o wyjściu szczęśliwym jak lis.

Musimy spróbować ... złapać wiele formatów datetime fmt1, fmt2, ..., fmtn i ukryć / obsłużyć wyjątki (od strptime()) dla wszystkich tych, którzy są niedopasowani (a w szczególności unikać potrzeby zawrotnej drabiny z głębokim wcięciem n .. klauzule catch). Z mojego rozwiązania

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
źródło
Pytanie nie mówiło nic o „wielu, niedopasowanych, niekompletnych, niespójnych i wielojęzycznych formatach daty / regionu” itp. Może to być prawdziwy problem, ale tutaj nie ma znaczenia.
RoG
1
@RoG: Nigdy nie mówiono, że nie byli, i sugerowało, że byli: „ogromna lista ... baza danych” . W większości każdej bazy danych / pliku dziennika, nad którym pracowałem (nawet w niewielkich rozmiarach), było wiele formatów dat, identyfikatorów stref czasowych, MM-DD itp. W produkcji niedopuszczalne jest pisanie kruchego kodu, który koduje na stałe w formatach i ulega awarii, z wyjątkiem nie otrzymuje oczekiwanego formatu (nawet zwracanie None lub „” jest bardziej dopuszczalne). Stąd potrzeba wielu formatów. Dlatego rozwiązuje to zadane pytanie i poświęciłem trochę czasu na znalezienie najbardziej Pythońskiego sposobu radzenia sobie z błędami z wielu formatów.
smci
„ogromna lista ... baza danych” oznacza po prostu, że jest ich wiele, a nie że wszystkie są w różnych formatach. Dopuszczalne jest pisanie kodu, który odczytuje jeden format, jeśli wiesz, że na wejściu jest jeden format. W takim przypadku powinno się zawiesić, jeśli zostanie przekazane coś, co nie jest w odpowiednim formacie.
RoG
@RoG: niedopuszczalne jest pisanie kodu produkcyjnego, który ulega awarii przy nieprawidłowym formacie / zniekształconym Unicode / obciętym / brakującym / danych, NaNs, M / D / Y vs D / M / Y, YY vs YYYY itp. Zwłaszcza jeśli wyjątków można uniknąć dzięki siedmiowarstwowemu rozwiązaniu, jak pokazałem. Większość takich „ogromnych baz danych” w świecie rzeczywistym jest właśnie taka. Tylko dlatego, że OP nie powiedział wprost, że nie oznacza to, że nie jest to typowy kontekst. Nie zamierzam się z tobą sprzeczać. Na jakich zestawach danych pracujesz i dlaczego uważasz, że te założenia są uzasadnione? Chyba że mówimy tylko o kodzie zabawkowym, który wymaga stałej interwencji.
smci
1
Głupotą wydaje się zakładanie z całkowitą pewnością, że PO musi mieć dane, które nigdy nie są niespójne. Tak, możliwe jest posiadanie takich danych, ale nie możemy założyć, że tak jest w tym przypadku. Pomyślałem, że ta odpowiedź jest przydatna, z pewnością dla mnie, którego poszukiwanie podobnych odpowiedzi na bardzo podobne pytanie, gdzie niekonsekwencje są zdecydowanie problemem.
Paul Miller
1
emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")
emp.info()

pokazuje kolumnę „Data rozpoczęcia Godzina” i „Czas ostatniego logowania” w ramce danych są to „object = strings”

<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

Korzystając ze wspomnianej parse_datesopcji read_csv, możesz przekonwertować ciąg datetime na format panda datetime.

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
źródło