Mam stosunkowo duży zbiór danych, który chcę podzielić na wiele ramek danych w Pyton na podstawie kolumny zawierającej obiekt datetime. Wartości w kolumnie (którą chcę podzielić ramkę danych według) podane są w następującym formacie:
2015-11-01 00:00:05
Możesz założyć, że ramka danych wygląda tak.
Jak mogę Podziel ramkę danych na 5-sekundowe interwały w następujący sposób:
Pierwsza ramka danych
2015-11-01 00:00:00 - 2015-11-01 00:00:05
,Druga ramka danych
2015-11-01 00:00:05 - 2015-11-01 00:00:10
, i tak dalej.
Muszę również policzyć liczbę obserwacji w każdej z powstałych ramek danych. Innymi słowami, byłoby miło, gdybym mógł dostać kolejna ramka danych z 2 kolumnami (pożądany format wyjściowy można znaleźć poniżej):
- Pierwsza kolumna reprezentuje podzieloną grupę (wartościtej kolumny nie ma znaczenia: mogą to być po prostu 1, 2, 3, .. wskazując kolejność 5-sekundowych interwałów, na przykład 1 może odnosić się do okresu 2015-11-01 00:00:00 - 2015-11-01 00:00:05, 2 może odnosić się do okresu 2015-11-01 00:00:05 - 2015-11-01 00:00:10 i tak dalej),
- Druga kolumna pokazuje liczbę obserwacji przypadających na każdy odpowiedni interwał.
Odpowiedzi:
2 dla odpowiedzi № 1Stwórz dictionary of DataFrame
s i dodaj nową kolumnę za pomocą assign
:
rng = pd.date_range("2015-11-01 00:00:00", periods=100, freq="S")
df = pd.DataFrame({"Date": rng, "a": range(100)})
print (df.head(10))
Date a
0 2015-11-01 00:00:00 0
1 2015-11-01 00:00:01 1
2 2015-11-01 00:00:02 2
3 2015-11-01 00:00:03 3
4 2015-11-01 00:00:04 4
5 2015-11-01 00:00:05 5
6 2015-11-01 00:00:06 6
7 2015-11-01 00:00:07 7
8 2015-11-01 00:00:08 8
9 2015-11-01 00:00:09 9
g = df.groupby(pd.Grouper(key="Date", freq="5S"))
dfs = {k.strftime("%Y-%m-%d %H:%M:%S"):v.assign(A=range(1,len(v)+1), B=len(v)) for k,v in g}
print (dfs["2015-11-01 00:00:05"])
Date a A B
5 2015-11-01 00:00:05 5 1 5
6 2015-11-01 00:00:06 6 2 5
7 2015-11-01 00:00:07 7 3 5
8 2015-11-01 00:00:08 8 4 5
9 2015-11-01 00:00:09 9 5 5
W razie potrzeby zliczaj wiersze najpierw aggreagte size
i dla Interval
to jest 1 do indeksu:
df1 = df.groupby(pd.Grouper(key="Date", freq="5S")).size().reset_index(name="Count")
df1["Interval"] = df1.index + 1
print (df1.head())
Date Count Interval
0 2015-11-01 00:00:00 5 1
1 2015-11-01 00:00:05 5 2
2 2015-11-01 00:00:10 5 3
3 2015-11-01 00:00:15 5 4
4 2015-11-01 00:00:20 5 5