Jednym ze sposobów jest dodanie kolumny na rok, miesiąc i dzień:
df['year'] = df.SomeDatetimeColumn.map(lambda x: x.year)
df['month'] = df.SomeDatetimeColumn.map(lambda x: x.month)
df['day'] = df.SomeDatetimeColumn.map(lambda x: x.day)
Następnie grupa przez cały rok i miesiąc, porządek w dzień, i podjąć tylko pierwszy wpis (który będzie wpisem minimalnego dnia).
df.groupby(
['year', 'month']
).apply(lambda x: x.sort('day', ascending=True)).head(1)
Zastosowanie lambda
wyrażeń sprawia, że to mniej niż idealne dla dużych zbiorów danych. Możesz nie chcieć powiększać rozmiaru danych, zachowując oddzielnie przechowywane wartości roku, miesiąca i dnia. Jednak w przypadku tego rodzaju problemów z dostosowaniem daty ad hoc bardzo pomocne jest wcześniejsze lub późniejsze oddzielenie tych wartości.
Innym podejściem jest grupą bezpośrednio przez funkcję kolumny datetime:
dfrm.groupby(
by=dfrm.dt.map(lambda x: (x.year, x.month))
).apply(lambda x: x.sort('dt', ascending=True).head(1))
Zwykle te problemy pojawiają się ze względu na patologicznej bazy danych lub przechowywania danych schematu że istnieje jeden poziom przed warstwy python/PANDAS.
Na przykład w tej sytuacji powinieneś polegać na istnieniu tabeli z danymi kalendarza lub zestawu danych kalendarza zawierającego (lub ułatwiającą zapytanie) najwcześniejszą aktywną datę w miesiącu w stosunku do dany zbiór danych (taki jak pierwszy dzień handlowy, pierwszy dzień tygodnia, pierwszy dzień roboczy, pierwsze święto lub cokolwiek innego).
Jeśli istnieje tabela towarzysząca dla tych danych, powinno być łatwo połączyć ją z zestawem danych, który już załadowałeś (powiedzmy, łącząc się z kolumną daty, którą już masz), a następnie jest to tylko kwestia zastosowania filtr logiczny w kolumnach danych kalendarza.
Staje się to szczególnie ważne, gdy trzeba korzystać z opóźnień czasowych: na przykład zestawienie wartości rynkowej spółki 1-miesięcznej z obecnym zyskiem ze sprzedaży w bieżącym miesiącu w celu obliczenia całkowitego zwrotu zrealizowanego w ciągu tego 1 miesiąca Kropka.
Ten może być wykonane przez tyle kolumn w pand z shift
lub staramy się robić skomplikowane samosprzężenie że prawdopodobnie bardzo bug podatna i stwarza problem utrwalenia konkretnej daty konwencję do każdego miejsca downstream, który wykorzystuje dane z tego kodu.
Znacznie lepiej jest po prostu żądać (lub robić to samemu), że dane muszą poprawnie znormalizować funkcje daty w ich nieprzetworzonym formacie (baza danych, pliki płaskie, cokolwiek) i aby zatrzymać to, co robisz, najpierw napraw to problem z datą, i dopiero wtedy wróć do przeprowadzenia analizy z danymi daty.
Chciałem dodać, będziesz mógł napisać 'pd.DatetimeIndex (df.date) .to_period ('M')' jako 'df.date.dt.to_period ('M')' z 0.15. –
Dzięki! To było dokładnie to, czego szukałem. – tadalendas