Mam ogromną ramkę danych z wieloma kolumnami, z których wiele jest typu datetime.datetime
. Problem polega na tym, że wiele z nich ma również typy mieszane, w tym na przykład datetime.datetime
wartości i None
wartości (i potencjalnie inne nieprawidłowe wartości):
0 2017-07-06 00:00:00
1 2018-02-27 21:30:05
2 2017-04-12 00:00:00
3 2017-05-21 22:05:00
4 2018-01-22 00:00:00
...
352867 2019-10-04 00:00:00
352868 None
352869 some_string
Name: colx, Length: 352872, dtype: object
W rezultacie powstaje object
kolumna typu. Można to rozwiązać za pomocą df.colx.fillna(pd.NaT)
. Problem polega na tym, że ramka danych jest zbyt duża, aby wyszukiwać pojedyncze kolumny.
Można też zastosować inne podejście pd.to_datetime(col, errors='coerce')
, ale spowoduje to rzutowanie na datetime
wiele kolumn zawierających wartości liczbowe.
Mógłbym to zrobić df.fillna(float('nan'), inplace=True)
, chociaż kolumny zawierające daty są nadal object
typu i nadal miałyby ten sam problem.
Co mogę śledzić podejście do obsady do datetime te kolumny, których wartości naprawdę zawierają datetime
wartości, ale może też zawierać None
i potencjalnie kilka nieprawidłowych wartości (podając ponieważ w przeciwnym razie pd.to_datetime
w sposób try
/ except
klauzula zrobi)? Coś w rodzaju elastycznej wersjipd.to_datetime(col)
datetime.datetime
lubpandas._libs.tslibs.timestamps.Timestamp
? Jeśli to pierwsze, zalecałbym zmianę cokolwiek, co stworzyło datetime, na typ, którypandas
radzi sobie nieco lepiej.None
w Twoich kolumnach znajdują się rzeczywisteNone
czy łańcuchowe reprezentacje tego?None
sznurkiem. Potencjalnie mogą być również błędne wartości ... @erfandatetime
ivalues
w nim?Odpowiedzi:
Główny problem, jaki widzę, dotyczy analizy wartości liczbowych.
Proponuję najpierw przekonwertować je na łańcuchy
Ustawiać
Rozwiązanie
źródło
pd.to_datetime
icoerce
błędy, ponieważ jest ich wiele. Problem dotyczył kolumn numerycznych. Ale nie przyszło mi do głowy, że kolumny liczbowe rzutowane na ciąg nie są analizowane przez pandyto_datetime
. Dzięki bardzo, to naprawdę pomaga!Ta funkcja ustawi typ danych kolumny na datetime, jeśli jakakolwiek wartość w kolumnie odpowiada wzorowi wyrażeń regularnych (\ d {4} - \ d {2} - \ d {2}) + (np. 01.01.2019 ). Podziękowania dla tej odpowiedzi dotyczącej wyszukiwania ciągu we wszystkich kolumnach Pandas DataFrame i filtrowania, które pomogły w ustawieniu i zastosowaniu maski.
dateutil
Może to pomóc w pracy z sugestią użycia . Nadal działa założenie, że jeśli w kolumnie znajdują się wartości podobne do daty, kolumna powinna być datą / godziną. Próbowałem rozważyć różne metody iteracji ramek danych, które są szybsze. Myślę, że ta odpowiedź na temat iteracji po wierszach w DataFrame w Pandach dobrze je opisała.Pamiętaj, że
dateutil.parser
użyje bieżącego dnia lub roku dla dowolnych ciągów, takich jak „grudzień” lub „listopad 2019”, bez wartości roku lub dnia.Jeśli chcesz również użyć wartości datatime
dateutil.parser
, możesz dodać to:źródło
dateutil
moduł wymieniony przez @Serge wygląda na przydatny.dateutil.parse
identyfikowałem wiele różnych rodzajów ciągów dat.