Dies war der Fluch meines Lebens in den letzten paar Tagen. Ich habe zahlreiche Pandas-Dataframes, die Zeitreihendaten mit unregelmäßigen Häufigkeiten enthalten. Ich versuche, diese in einen einzigen Datenrahmen zu bringen.Pandas, die mehrere Datenrahmen mit TimeStamp index ausrichten
Unten finden Sie einige Code, mit repräsentativen Datenrahmen, df1
, df2
und df3
(ich habe tatsächlich n = 5, und würde eine Lösung zu schätzen wissen, die für alle n>2
funktionieren würde):
# 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
ich eine haben Idee, warum ich diesen Fehler, so dass ich in combined_1_n_2
der doppelten Indizes los und versuchen Sie es erneut:
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
Warum bin ich diesen Fehler? Auch wenn das funktionierte, ist es komplett manuell und hässlich. Wie kann ich> 2 Zeitreihen ausrichten und in einem einzigen Datenrahmen kombinieren?
Daten:
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' ] ])
Danke, das ist überraschend; also ist das 'align()' unnötig, wenn ich die Kettenverbindungen mache? – Rhubarb
Korrekt, 'Join' behandelt die Indexlogik für Sie. – chrisb
Danke, aus Neugierde: Könntest du kurz darauf eingehen, wenn man dann die align() benutzen muss? Weil es scheint, dass join() sowohl die Ausrichtung als auch die Verkettung in einem Zug handhabt. – Rhubarb