Używam pandas.to_datetime
do analizowania dat w moich danych. Pandy domyślnie reprezentują daty, datetime64[ns]
mimo że wszystkie są tylko codziennie. Zastanawiam się, czy istnieje elegancki / sprytny sposób na konwersję dat, datetime.date
czy też datetime64[D]
tak, że kiedy piszę dane do CSV, daty nie są dołączane 00:00:00
. Wiem, że mogę ręcznie przekonwertować typ element po elemencie:
[dt.to_datetime().date() for dt in df.dates]
Ale to jest naprawdę wolne, ponieważ mam wiele wierszy i to w pewnym sensie nie pozwala na użycie pandas.to_datetime
. Czy istnieje sposób na konwersję dtype
całej kolumny jednocześnie? Czy też pandas.to_datetime
obsługuje precyzyjne specyfikacje, dzięki którym mogę pozbyć się części czasu podczas pracy z codziennymi danymi?
df.dates.apply(lambda x: x.date())
powinienem być co najmniej trochę szybszy. spójrz także na github.com/pydata/pandas/issues/2583Odpowiedzi:
Od wersji
0.15.0
można to teraz łatwo zrobić za pomocą.dt
dostępu do komponentu daty:Powyższe zwraca
datetime.date
typ dtype, jeśli chcesz go miećdatetime64
, możesz tylkonormalize
komponent czasu do północy, aby ustawić wszystkie wartości na00:00:00
:To zachowuje typ,
datetime64
ale wyświetlacz pokazuje tylkodate
wartość.źródło
Proste rozwiązanie:
źródło
Chociaż głosowałem za odpowiedzią EdChum, która jest najbardziej bezpośrednią odpowiedzią na postawione przez OP pytanie, to tak naprawdę nie rozwiązuje problemu wydajności (nadal opiera się na
datetime
obiektach python , a zatem wszelkie operacje na nich nie będą wektoryzowane - to znaczy będzie wolny).Lepszą skutecznością jest użycie
df['dates'].dt.floor('d')
. Ściśle mówiąc, nie „zachowuje tylko daty”, ponieważ po prostu ustawia czas00:00:00
. Ale działa zgodnie z oczekiwaniami PO, gdy na przykład:groupby
... i jest znacznie wydajniejszy, ponieważ operacja jest wektoryzowana.
EDIT: w rzeczywistości, odpowiedź PO byłaby korzystna jest prawdopodobnie „Nowsze wersje
pandas
mają nie napisać czasu do CSV, jeśli jest00:00:00
dla wszystkich obserwacji”.źródło
to_json
nadal pisze pełny00:00:00
.date_format='iso'
? Domyślnie wyświetla tylko sekundy od epoki.dt.normalize()
w seriach dłuższych niż kilkaset elementów.Pandy
DatetimeIndex
iSeries
wywołać metodę,normalize
która robi dokładnie to, co chcesz.Możesz przeczytać więcej na ten temat w tej odpowiedzi .
Może być używany jako
ser.dt.normalize()
źródło
Pandas v0.13 +: Użyj
to_csv
zdate_format
parametremW miarę możliwości unikaj przekształcania
datetime64[ns]
serii wobject
seriędatetime.date
obiektów typu dtype . Ten ostatni, często skonstruowany przy użyciupd.Series.dt.date
, jest przechowywany jako tablica wskaźników i jest nieefektywny w stosunku do serii opartej wyłącznie na NumPy.Ponieważ Twoja obawa dotyczy formatu podczas pisania do pliku CSV , wystarczy użyć
date_format
parametruto_csv
. Na przykład:Zobacz dyrektywy Pythona
strftime
dotyczące konwencji formatowania.źródło
Jest to prosty sposób na wyodrębnienie daty:
źródło
Konwertowanie na
datetime64[D]
:Chociaż ponowne przypisanie tego do kolumny DataFrame spowoduje przywrócenie go z powrotem do [ns].
Jeśli chcesz faktycznie
datetime.date
:źródło
dt
dołącza moduł datetime, ponieważ ten fragment odpowiedzi zastąpi ten moduł! @ Dale-Jung, być może może zmienić linię na coś takiego jak dt_indexdf.loc[date]
metody indeks wraca do znacznika czasu, co oznacza, że kolejne porównania już nie działająPo prostu udzielam bardziej aktualnej odpowiedzi na wypadek, gdyby ktoś zobaczył ten stary post.
Dodanie „utc = False” podczas konwersji na datetime spowoduje usunięcie komponentu strefy czasowej i zachowanie tylko daty w typie danych datetime64 [ns].
Będzie można go zapisać w programie Excel bez wyświetlania błędu „Błąd wartości: program Excel nie obsługuje czasów danych w strefach czasowych. Przed zapisaniem w programie Excel upewnij się, że czasy danych nie są znane.
źródło
Chciałem móc zmienić typ zestawu kolumn w ramce danych, a następnie usunąć czas, utrzymując dzień. round (), floor (), ceil () wszystkie prace
źródło