Dziś pozytywnie zaskoczył mnie fakt, że pandy odczytując dane z pliku danych (np.) Potrafią rozpoznać typy wartości:
df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])
Przykładowo można to sprawdzić w ten sposób:
for i, r in df.iterrows():
print type(r['col1']), type(r['col2']), type(r['col3'])
W szczególności liczby całkowite, zmiennoprzecinkowe i łańcuchy zostały poprawnie rozpoznane. Jednak mam kolumnę, która ma dat w następującym formacie: 2013-6-4
. Daty te były rozpoznawane jako ciągi znaków (a nie jako obiekty dat w języku Python). Czy istnieje sposób, aby „nauczyć się” pandy do uznanych dat?
df.iterrows()
i przeglądać ich dla każdego wiersza, po prostu zróbdf.info()
raz.Odpowiedzi:
Powinieneś dodać
parse_dates=True
, lubparse_dates=['column name']
podczas czytania, zwykle wystarczy, aby magicznie go przeanalizować. Ale zawsze są dziwne formaty, które należy zdefiniować ręcznie. W takim przypadku możesz również dodać funkcję parsera daty, co jest najbardziej elastycznym sposobem.Załóżmy, że masz kolumnę „datetime” ze swoim ciągiem, a następnie:
W ten sposób możesz nawet połączyć wiele kolumn w jedną kolumnę z datą i godziną, co scala kolumny „data” i „godzina” w jedną kolumnę „data i godzina”:
Można znaleźć dyrektyw (tj litery mają być stosowane do różnych formatów) dla
strptime
istrftime
na tej stronie .źródło
TypeError: strptime() argument 1 must be str, not float
infer_datetime_format
: „pandy będą próbowały wywnioskować format ciągów daty i godziny w kolumnach”. Można tego użyć zamiastdate_parser
.ISO 8601
formacie, nie powinieneś przekazywaćinfer_datetime_format
funkcji parsera - jest to znacznie wolniejsze niż pozwolenie pandom na obsługę (zwłaszcza tej drugiej). Format daty w tej odpowiedzi również należy do tej kategoriiByć może interfejs pandy zmienił się od czasu odpowiedzi @Rutger, ale w wersji, której używam (0.15.2),
date_parser
funkcja otrzymuje listę dat zamiast pojedynczej wartości. W takim przypadku jego kod należy zaktualizować w następujący sposób:źródło
Metoda pandy read_csv świetnie nadaje się do analizowania dat. Pełna dokumentacja pod adresem http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
możesz nawet umieścić różne części daty w różnych kolumnach i przekazać parametr:
Domyślne wykrywanie dat działa świetnie, ale wydaje się być tendencyjne do północnoamerykańskich formatów dat. Jeśli mieszkasz gdzie indziej, czasami możesz dać się złapać na wynikach. O ile dobrze pamiętam, 1/6/2000 oznacza 6 stycznia w USA w przeciwieństwie do 1 czerwca, gdzie mieszkam. Jest wystarczająco sprytne, aby je obracać, jeśli używane są daty takie jak 23.06.2000. Prawdopodobnie bezpieczniej jest pozostać przy zmianach daty RRRRMMDD. Przepraszamy programistów pand, ale ostatnio nie testowałem tego z lokalnymi datami.
możesz użyć parametru date_parser, aby przekazać funkcję konwertującą twój format.
źródło
dayfirst
jako Prawda dla dat europejskich / międzynarodowych. pandas.pydata.org/pandas-docs/stable/generated/…Możesz użyć
pandas.to_datetime()
zgodnie z zaleceniami w dokumentacji dlapandas.read_csv()
:Próbny:
źródło
Przy scalaniu dwóch kolumn w jedną kolumnę datetime, zaakceptowana odpowiedź generuje błąd (pandy w wersji 0.20.3), ponieważ kolumny są wysyłane osobno do funkcji date_parser.
Następujące prace:
źródło
Tak - zgodnie z
pandas.read_csv
dokumentacją :Więc jeśli twój csv ma kolumnę o nazwie,
datetime
a daty wyglądają jak2013-01-01T01:01
na przykład, uruchomienie tego spowoduje, że pandy (jestem na v0.19.2) automatycznie pobiorą datę i godzinę:df = pd.read_csv('test.csv', parse_dates=['datetime'])
Zauważ, że musisz wyraźnie przejść
parse_dates
, to nie działa bez.Zweryfikuj za pomocą:
df.dtypes
Powinieneś zobaczyć typ danych kolumny
datetime64[ns]
źródło
Jeśli wydajność ma dla Ciebie znaczenie, upewnij się, że masz czas:
wydruki:
Więc z ISO8601 sformatowany daty (
%Y-%m-%d %H:%M:%S
to widocznie data ISO8601 sformatowany, myślę T mogą zostać usunięte i zastąpione spacją) należy nie podaćinfer_datetime_format
(co nie robi różnicy z bardziej pospolitych albo widocznie) i przekazywanie własnych parser tylko paraliżuje wydajność. Z drugiej stronydate_parser
robi różnicę w przypadku niezbyt standardowych formatów dni. Pamiętaj, aby jak zwykle czas przed optymalizacją.źródło
Podczas wczytywania pliku csv zawiera kolumnę z datą. Mamy dwa sposoby, aby pandy rozpoznawały kolumnę z datą, tj
Pandy jawnie rozpoznają format po arg
date_parser=mydateparser
Pandy niejawnie rozpoznają format przez agr
infer_datetime_format=True
Niektóre dane z kolumny daty
01/01/18
01/02/18
Tutaj nie znamy pierwszych dwóch rzeczy. Może to być miesiąc lub dzień. Więc w tym przypadku musimy użyć metody 1: - Jawne przekazanie formatu
Metoda 2: - Niejawne lub automatyczne rozpoznawanie formatu
źródło