To była zmora mego życia od kilku dni. Mam wiele Pandas Dataframes, które zawierają dane szeregów czasowych o nieregularnych częstotliwościach. Próbuję je wyrównać w jedną ramkę danych.Pandy wyrównujące wiele ramek danych ze wskaźnikiem TimeStamp
Poniżej jest jakiś kod, z reprezentatywnymi dataframes, df1
, df2
i df3
(I rzeczywiście n = 5, i doceni rozwiązanie, które będzie działać dla wszystkich n>2
):
# df1, df2, df3 are given at the bottom
import pandas as pd
import datetime
# I can align df1 to df2 easily
df1aligned, df2aligned = df1.align(df2)
# And then concatenate into a single dataframe
combined_1_n_2 = pd.concat([df1aligned, df2aligned], axis =1)
# Since I don't know any better, I then try to align df3 to combined_1_n_2 manually:
combined_1_n_2.align(df3)
error: Reindexing only valid with uniquely valued Index objects
mam pomysł, dlaczego ten błąd, więc pozbyć się duplikatów indeksów w combined_1_n_2
i spróbuj jeszcze raz:
combined_1_n_2 = combined_1_n_2.groupby(combined_1_n_2.index).first()
combined_1_n_2.align(df3) # But stll get the same error
error: Reindexing only valid with uniquely valued Index objects
Dlaczego otrzymuję ten błąd? Nawet jeśli to zadziałało, jest całkowicie ręczne i brzydkie. Jak wyrównać> 2 serie czasowe i połączyć je w jedną ramkę danych?
danych:
df1 = pd.DataFrame({'price' : [62.1250,62.2500,62.2375,61.9250,61.9125 ]},
index = [pd.DatetimeIndex([datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')])[0]
for s in ['2008-06-01 06:03:59.614000', '2008-06-01 06:03:59.692000',
'2008-06-01 06:15:42.004000', '2008-06-01 06:15:42.083000','2008-06-01 06:17:01.654000' ] ])
df2 = pd.DataFrame({'price': [241.0625, 241.5000, 241.3750, 241.2500, 241.3750 ]},
index = [pd.DatetimeIndex([datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')])[0]
for s in ['2008-06-01 06:13:34.524000', '2008-06-01 06:13:34.602000',
'2008-06-01 06:15:05.399000', '2008-06-01 06:15:05.399000','2008-06-01 06:15:42.082000' ] ])
df3 = pd.DataFrame({'price': [67.656, 67.875, 67.8125, 67.75, 67.6875 ]},
index = [pd.DatetimeIndex([datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')])[0]
for s in ['2008-06-01 06:03:52.281000', '2008-06-01 06:03:52.359000',
'2008-06-01 06:13:34.848000', '2008-06-01 06:13:34.926000','2008-06-01 06:15:05.321000' ] ])
Dziękuję, to zaskakujące; więc "align()" jest zbędne, jeśli wykonuję łączenia łańcuchów? – Rhubarb
Prawidłowo, 'join' obsługuje logikę indeksu. – chrisb
Dziękuję, z ciekawości: czy mógłbyś krótko się nad tym zastanowić, kiedy trzeba użyć funkcji align(), a następnie? Ponieważ dla mnie wydaje się, że join() obsługuje zarówno wyrównanie, jak i konkatenację za jednym razem. – Rhubarb