Mam Dataframe, df, z następującą kolumną:
df['ArrivalDate'] =
...
936 2012-12-31
938 2012-12-29
965 2012-12-31
966 2012-12-31
967 2012-12-31
968 2012-12-31
969 2012-12-31
970 2012-12-29
971 2012-12-31
972 2012-12-29
973 2012-12-29
...
Elementy kolumny to pandas.tslib.Timestamp.
Chcę tylko podać rok i miesiąc. Myślałem, że będzie prosty sposób, ale nie mogę tego rozgryźć.
Oto, co próbowałem:
df['ArrivalDate'].resample('M', how = 'mean')
Wystąpił następujący błąd:
Only valid with DatetimeIndex or PeriodIndex
Potem spróbowałem:
df['ArrivalDate'].apply(lambda(x):x[:-2])
Wystąpił następujący błąd:
'Timestamp' object has no attribute '__getitem__'
Jakieś sugestie?
Edycja: W pewnym sensie to rozgryzłem.
df.index = df['ArrivalDate']
Następnie mogę ponownie próbkować kolejną kolumnę za pomocą indeksu.
Ale nadal chciałbym metodę rekonfiguracji całej kolumny. Jakieś pomysły?
to_period
:df.date_column.dt.month
(.year
lub.day
) prac.dt.month
traci jednak rok. I.dt.to_period('M')
zmienia typ danych na coś, co nie jest już datetime64. Skończyło się na tym, że Juan użył odpowiedzi sugerującej.astype('datetime64[M]')
skrócenie wartości.Odpowiedzi:
Jeśli chcesz, aby nowe kolumny z osobnym rokiem i miesiącem były dostępne, możesz to zrobić:
lub...
Następnie możesz je połączyć lub pracować z nimi takimi, jakimi są.
źródło
timeit
sugerują, żeDatetimeIndex
podejście jest znacznie szybsze niż jeden.map/.apply
lub.dt
.df['date_column_trunc'] = df[date_column'].apply(lambda s: datetime.date(s.year, s.month, 1)
Najlepszy sposób znaleziony !!
df['date_column']
musi być w formacie czasowym dat.Możesz także użyć opcji
D
Dzień,2M
2 miesiące itp. Do różnych przedziałów próbkowania, a jeśli dane szeregów czasowych są opatrzone znacznikiem czasu, możemy przejść do szczegółowych przedziałów próbkowania, takich jak45Min
45 minut,15Min
15 minut próbkowania itp.źródło
datetime64
już typu dtype. Używającdf.my_date_column.astype('datetime64[M]')
, jak w odpowiedzi @ Juana, konwertuje się na daty reprezentujące pierwszy dzień każdego miesiąca.Można bezpośrednio uzyskać dostęp do
year
imonth
atrybutów, lub poprosić odatetime.datetime
:Jednym ze sposobów łączenia roku i miesiąca jest utworzenie liczby całkowitej kodującej je, na przykład:
201408
dla sierpnia 2014 r. Wzdłuż całej kolumny można to zrobić w następujący sposób:lub wiele ich wariantów.
Nie jestem wielkim fanem robienia tego, ponieważ powoduje to, że wyrównanie daty i arytmetyka są bolesne później, a szczególnie bolesne dla innych, którzy napotkają twój kod lub dane bez tej samej konwencji. Lepszym sposobem jest wybranie konwencji dotyczącej dnia, na przykład końcowego dnia tygodnia poza USA, pierwszego dnia itp., I pozostawienie danych w formacie daty / godziny z wybraną konwencją dat.
calendar
Moduł jest użyteczny do uzyskania wartości liczbowej określonych dni, takie jak końcowego tygodnia. Następnie możesz zrobić coś takiego:Jeśli szukasz sposobu na rozwiązanie prostszego problemu polegającego na sformatowaniu kolumny daty i godziny na jakąś strunową reprezentację, możesz po prostu skorzystać z
strftime
funkcjidatetime.datetime
klasy:źródło
pandas
techniki dzielenia i łączenia. Moje powyższe sugestie nie powinny być traktowane jako poparcie dla tego, że są najbardziej wydajnym podejściem do twojej sprawy - po prostu, że są one stylistycznie poprawnymi wyborami w Pythonie dla szeregu przypadków.df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month)
.Jeśli chcesz mieć unikalną parę miesiąc-rok, użycie Apply jest dość eleganckie.
Dane wyjściowe miesiąc-rok w jednej kolumnie.
Nie zapomnij najpierw zmienić formatu na datę, zwykle zapominam.
źródło
df['month_year'] = df['date_column'].dt.strftime('%B-%Y')
Wydobywając rok powiedzmy z ['2018-03-04']
Plik df [„Year”] tworzy nową kolumnę. Natomiast jeśli chcesz wyodrębnić miesiąc, użyj .month
źródło
Możesz najpierw przekonwertować ciągi dat za pomocą pandas.to_datetime , co daje dostęp do wszystkich funkcji numpy datetime i timedelta . Na przykład:
źródło
trunc
. Czy jest jakaś dokumentacja doastype('datetime64[M]')
konwencji?Dzięki jaknap32 chciałem agregować wyniki według roku i miesiąca, więc zadziałało:
Wynik był czysty:
źródło
@ Rozwiązanie KieranPC jest poprawnym podejściem do Pand, ale nie jest łatwe do rozszerzenia o dowolne atrybuty. W tym celu możesz użyć
getattr
rozumienia generatora i połączyć, używającpd.concat
:źródło
To działało dobrze dla mnie, nie sądziłem, że pandy zinterpretują wynikową datę sznurka jako datę, ale kiedy zrobiłem fabułę, znał bardzo dobrze mój program i ciąg roku_miesiąc, w którym właściwie zamówiłem ... muszę pokochać pandy!
źródło
Istnieją dwa kroki, aby wyodrębnić rok dla wszystkich ramek danych bez zastosowania metody.
Krok 1
przekonwertuj kolumnę na datetime:
Krok 2
wyodrębnij rok lub miesiąc za pomocą
DatetimeIndex()
metodyźródło
JEDNA LINIA: Dodanie kolumny z parami „rok-miesiąc”: („pd.to_datetime” najpierw zmienia typ kolumny na datę-czas przed operacją)
Odpowiednio dla dodatkowej kolumny „rok” lub „miesiąc”:
źródło