Für Pandas Version 0.19.0 oder besser finden ajcr's answer.
Für Pandas Versionen < 0.19.0: Sie könnten die beiden Datenrahmen kombinieren, mit concat
, ffill
verwenden die NaN-Werte mit den Soll-Werten zu zukunfts füllen, und dann update
df1
mit diesen Werten:
import pandas as pd
df2 = pd.DataFrame({'value':[0.612303,0.482605,0.604132]}, index=pd.DatetimeIndex(['2015-10-06 09:00:00', '2015-10-06 10:00:00', '2015-10-06 11:00:00']))
df1 = pd.DataFrame({'value':[0.412303, 0.112303, 0., 0.000005, 0.133132]}, index=pd.DatetimeIndex(['2015-10-06 09:05:00', '2015-10-06 09:08:00', '2015-10-06 09:28:00', '2015-10-06 10:15:00', '2015-10-06 11:00:00']))
df1.update(pd.concat([df1, df2], axis=1).ffill().iloc[:, 1])
print(df1)
ergibt
value
2015-10-06 09:05:00 0.612303
2015-10-06 09:08:00 0.612303
2015-10-06 09:28:00 0.612303
2015-10-06 10:15:00 0.482605
2015-10-06 11:00:00 0.604132
Alternativ können Sie searchsorted
verwenden, um die Indexwerte zu finden, die angeben, wo df1.index
passt in df2.index
:
import pandas as pd
df2 = pd.DataFrame({'value':[0.612303,0.482605,0.604132]}, index=pd.DatetimeIndex(['2015-10-06 09:00:00', '2015-10-06 10:00:00', '2015-10-06 11:00:00']))
df1 = pd.DataFrame({'value':[0.412303, 0.112303, 0., 0.000005, 0.133132]}, index=pd.DatetimeIndex(['2015-10-06 09:05:00', '2015-10-06 09:08:00', '2015-10-06 09:28:00', '2015-10-06 10:15:00', '2015-10-06 11:00:00']))
df1['value'] = df2.iloc[df2.index.searchsorted(df1.index, side='right')-1].values
print(df1)
ergibt
value
2015-10-06 09:05:00 0.612303
2015-10-06 09:08:00 0.612303
2015-10-06 09:28:00 0.612303
2015-10-06 10:15:00 0.482605
2015-10-06 11:00:00 0.604132
Beachten Sie, dass searchsorted
geht davon aus, dass df2.index
ist bereits in sortierter Reihenfolge. Wenn dies nicht der Fall ist, verwenden Sie zuerst df2 = df2.sort_index()
.
Im Gegensatz dazu pd.concat
gibt einen Datenrahmen, dessen DatatimeIndex ist in sortiert Ordnung, auch wenn df1.index
und/oder df2.index
ist nicht sortiert. So ist für die erste Methode der Aufruf sort_index
nicht notwendig.
Von diesen beiden Methoden ist searchsorted
schneller. Zum Beispiel mit diesem Setup:
import numpy as np
import pandas as pd
N = 1000
df1 = pd.DataFrame(np.random.random(N), index=pd.date_range('2000-1-1', periods=N, freq='14T'))
df2 = pd.DataFrame(np.random.random(int(N/60*14)), index=pd.date_range('2000-1-1', periods=int(N/60*14), freq='1H'))
df3, df4 = df1.copy(), df1.copy()
df3.update(pd.concat([df3, df2], axis=1).ffill().iloc[:, 1])
df4[0] = df2.iloc[df2.index.searchsorted(df4.index, side='right')-1].values
assert df3.equals(df4)
searchsorted
ist ~ 2.8x schneller:
In [88]: %timeit df3.update(pd.concat([df3, df2], axis=1).ffill().iloc[:, 1])
100 loops, best of 3: 2.13 ms per loop
In [89]: %timeit df4[0] = df2.iloc[df2.index.searchsorted(df4.index, side='right')-1].values
1000 loops, best of 3: 744 µs per loop
In [90]: len(df1), len(df2)
Out[90]: (1000, 233)
['merge_asof'] (http://pandas.pydata.org/pandas-docs/stable/merging.html#merging-asof) existiert für diesen Zweck. –
@ajcr das mein Problem gelöst hat. Danke, willst du mir eine Antwort schreiben? –
Ich habe eine Antwort mit 'merge_asof' unten hinzugefügt - lassen Sie mich wissen, wenn Sie weitere Details wünschen. –