背景
。我有一個由10萬個值組成的大型資料框架。資料框架的頭部看起來如下所示
df = pd.DataFrame([np.nan, 1100, 1400, np.nan, 14000]。
index=pd.to_datetime(["2011-05-25 10:00:00",
"2011-05-25 16:40:00"。
"2011-05-25 17:06:00"。
"2011-05-25 17:10:00"。
"2011-05-25 17:24:00"] )
0
2011-05-25 10:00:00 NaN
2011-05-25 16: 40: 00 1100.0
2011-05-25 17:06:00 1400.0
2011-05-25 17:10:00 NaN
2011-05-25 17: 24: 00 14000.0
我想要什么
這些值并不總是以6分鐘的時間步長來記錄。我想把那些沒有在6分鐘時間步長上記錄的值轉移到最近的6分鐘步長上。我希望新的資料框架看起來像下面這樣n_df = pd.DataFrame([np.nan, 1100, 1400, np.nan, 14000]。
index=pd.to_datetime(["2011-05-25 10:00:00",
"2011-05-25 16:42:00"。
"2011-05-25 17:06:00"。
"2011-05-25 17:12:00"。
"2011-05-25 17:24:00"] )
)
0
2011-05-25 10:00:00 NaN
2011-05-25 16: 42: 00 1100.0
2011-05-25 17:06:00 1400.0
2011-05-25 17:12:00 NaN
2011-05-25 17: 24: 00 14000.0
對我來說,重要的是n_df中的所有值都應該是6分鐘的時間步長,因此屬性n_df.index.freq不能是None。
我怎樣才能做到這一點。
到目前為止,我正在使用for回圈,通過迭代df并找到最近的6分鐘步驟,并將值轉移/復制到該步驟,但如果df大于1000,這就非常慢。
我試過的東西
index = pd.date_range(df.index[0], end=df.index[-1, freq="6min")
pydatetime_index = index.to_pydatetime()
n_df = pd.DataFrame(columns=df.columns, index=index)
for _idx, i in enumerate(df.index)。
nearest_neighbor = np.abs(pydatetime_index - i.to_pydatetime() )
idx = np.argmin(nearest_neighbor)
val = df.loc[i]
n_df.iloc[idx] = val
uj5u.com熱心網友回復:
你可以使用merge_asof與nearest并指定tolerance引數:
index = pd.date_range(df.index[0], end=df.index[-1], freq="6min")
df1 = pd.DataFrame(index=index)
df2 = pd.merge_asof(df1,
df,
left_index=True,
right_index=True,
direction='nearest',
tolerance=pd.Timedelta('3Min')
print (df2)
0 (df2)
2011-05-25 10:00:00 NaN
2011-05-25 10: 06:00 NaN
2011-05-25 10:12:00 NaN
2011-05-25 10:18:00 NaN
2011-05-25 10: 24: 00 NaN
...
2011-05-25 17: 00: 00 NaN
2011-25 17:06:00 1400.0
2011-05-25 17:12:00 NaN
2011-05-25 17:18:00 NaN
2011-05-25 17:24:00 14000.0
[75 行 x 1 列]
或者用DataFrame.reindex類似:
df2 = df.reindex(index, method='nearest', tolerance=pd.Timedelta('3Min')
print (df2)
0 (df2)
2011-05-25 10:00:00 NaN
2011-05-25 10: 06:00 NaN
2011-05-25 10:12:00 NaN
2011-05-25 10:18:00 NaN
2011-05-25 10: 24: 00 NaN
...
2011-05-25 17: 00: 00 NaN
2011-25 17:06:00 1400.0
2011-05-25 17:12:00 NaN
2011-05-25 17:18:00 NaN
2011-05-25 17:24:00 14000.0
[75 行 x 1 列]
或者:
df2 = df.resample('6Min').first()
print (df2)
0 (df2)
2011-05-25 10:00:00 NaN
2011-05-25 10: 06:00 NaN
2011-05-25 10:12:00 NaN
2011-05-25 10:18:00 NaN
2011-05-25 10: 24: 00 NaN
...
2011-05-25 17: 00: 00 NaN
2011-25 17:06:00 1400.0
2011-05-25 17:12:00 NaN
2011-05-25 17:18:00 NaN
2011-05-25 17:24:00 14000.0
[75 行 x 1 列]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/311906.html
標籤:
