Jaki jest elegancki sposób na obcięcie obiektu Python datetime?
W tym konkretnym przypadku do dnia. Więc w zasadzie ustaw godzinę, minutę, sekundy i mikrosekundy na 0.
Chciałbym, aby wynik był również obiektem typu data-godzina, a nie ciągiem.
Myślę, że tego właśnie szukasz ...
>>> import datetime
>>> dt = datetime.datetime.now()
>>> dt = dt.replace(hour=0, minute=0, second=0, microsecond=0) # Returns a copy
>>> dt
datetime.datetime(2011, 3, 29, 0, 0)
Ale jeśli tak naprawdę nie zależy ci na aspekcie czasowym rzeczy, powinieneś naprawdę tylko omijać date
przedmioty ...
>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)
replace()
metoda zwraca obiekt daty / godziny, więc poprawna inkantacja to:dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
datetime
, a niedate
obiekt (że można uzyskać za pomocądt.date()
wywołania (nie trzeba używać jawnego konstruktora))..replace()
Metoda może zawieść jeślidatetime
dodaje wsparcie nanosekund . Możesz zamiast tego użyćdatetime.combine()
.datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
?Użyj
date
nie,datetime
jeśli nie zależy ci na czasie.Możesz zaktualizować datę / godzinę w ten sposób:
źródło
Cztery lata później: inny sposób, unikanie
replace
Wiem, że przyjęta odpowiedź sprzed czterech lat działa, ale wydaje się to nieco lżejsze niż używanie
replace
:Notatki
datetime
obiekt bez przekazywania właściwości konstruktora, dostajesz północ.dt = datetime.datetime.now()
źródło
Nie można obciąć obiektu datetime, ponieważ jest on niezmienny .
Jest jednak jeden sposób na zbudowanie nowej daty / godziny z polami 0 godzin, minut, sekund i mikrosekund, bez wyrzucania oryginalnej daty lub tzinfo:
źródło
replace
opcję na pierwszym miejscu, ponieważ prawdopodobnie tego właśnie chcą.tzinfo=now.tzinfo
. Otzinfo
północy może być inna, np. Przesunięcie utc o2012-04-01 00:09:00
(9 rano) w strefie czasowej Australii / Melbourne jest,AEST+10:00
ale jestAEDT+11:00
o2012-04-01 00:00:00
(północy) - w tym dniu następuje przejście na koniec DST. Możesz użyćpytz
modułu, aby to naprawić, zobacz moją odpowiedź.Aby uzyskać północ odpowiadającą danemu obiektowi datetime, możesz użyć
datetime.combine()
metody :Zaletą w porównaniu do tej
.replace()
metody jest todatetime.combine()
, że oparte na rozwiązaniu rozwiązanie będzie nadal działać, nawet jeślidatetime
moduł wprowadzi obsługę nanosekund .tzinfo
można zachować, jeśli to konieczne, ale przesunięcie utc może być inne o północy, np. z powodu przejścia DST, a zatem naiwne rozwiązanie (ustawienietzinfo
atrybutu czasu) może się nie powieść. Zobacz Jak uzyskać czas UTC „północ” dla danej strefy czasowej?źródło
Możesz do tego użyć pand (chociaż może to być narzut dla tego zadania). Możesz użyć okrągłego , podłogowego i sufitowego jak dla zwykłych liczb i dowolnej częstotliwości pand z przesuniętych aliasów :
źródło
Możesz użyć datetime.strftime, aby wyodrębnić dzień, miesiąc, rok ...
Przykład:
Wyjście (na dziś):
Jeśli chcesz tylko pobrać dzień, możesz użyć atrybutu dnia, takiego jak:
Ouput (na dziś):
źródło
d.day
itp.Istnieje wspaniała biblioteka używana do manipulowania datami: Delorean
a jeśli chcesz odzyskać wartość daty / godziny:
źródło
Zobacz więcej na https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.floor.html
Jest teraz 2019, myślę, że najskuteczniejszym sposobem na to jest:
źródło
Istnieje moduł datetime_truncate, który obsługuje to za Ciebie. Po prostu wywołuje datetime.replace.
źródło
6 lat później ... Znalazłem ten post i bardziej podobało mi się podejrzane podejście:
Twoje zdrowie
źródło
źródło
Możesz po prostu użyć
Jest lekki i zwraca dokładnie to, czego chcesz.
źródło
Co oznacza obcinanie?
Masz pełną kontrolę nad formatowaniem za pomocą metody strftime () i odpowiedniego łańcucha formatu.
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
źródło
Jeśli masz do czynienia z serią typu DateTime, istnieje bardziej skuteczny sposób na ich obcięcie, szczególnie gdy obiekt Series ma wiele wierszy.
Możesz użyć funkcji podłogi
Na przykład, jeśli chcesz go skrócić do godzin:
Wygeneruj zakres dat
Możemy to sprawdzić, porównując czas działania funkcji wymiany i podłogi.
źródło
Oto jeszcze jeden sposób, który pasuje do jednej linii, ale nie jest szczególnie elegancki:
źródło