我有一个带有日期时间索引的数据框。我也有一个特定的日期列表,我有兴趣在数据框中查看这些日期。我想使行“ n”的位置早于我的特定日期列表。假设示例n = 5。这是我的代码:
import pandas as pd
# generate an example df
output = pd.DataFrame()
d = pd.date_range(start='1/1/2000', end='1/1/2006', freq='D')
output['Date'] = d
output['Value'] = 1
output = output[output['Date'].dt.dayofweek < 5].reset_index(drop=True) # remove weekends
output = output.set_index('Date')
# dates of interest
date_list = pd.to_datetime(['09/05/2002', '15/07/2004', '21/03/2005'], format='%d/%m/%Y')
# i can pull out the dates of interest, but I really want the dates '5' positions ahead
selection = output.iloc[output.index.isin(date_list)]
print(selection)
请注意,前面的'5'位置与timedelta(days = 5)不同
我知道这可以通过迭代来解决,例如:
for i, row in output.iterrows():
for i2 in date_list:
if i == i2:
print(i, output.loc[i2:].iloc[5])
但我希望使用矢量化的衬纸来理想地做到这一点。任何帮助将不胜感激?
非常感谢!
答案 0 :(得分:4)
您可以使用flatnonzero
来获取索引,将5
添加到索引中并进行索引:
import numpy as np
output.iloc[np.flatnonzero(output.index[:-5].isin(date_list)) + 5]
Value
Date
2002-05-16 1
2004-07-22 1
2005-03-28 1
或者我们也有熊猫的nonzero
:
output.iloc[output.index[:-5].isin(date_list).nonzero()[0]+5]
Value
Date
2004-07-08 1
2005-03-14 1
答案 1 :(得分:1)
首先获取您感兴趣的日期的行位置,然后以所需的数量进行补偿。然后使用偏移行位置从您的数据框中选择:
output.iloc[np.flatnonzero(ouput.index.isin(date_list)) + 5]
答案 2 :(得分:1)
如果按日期将其编入索引,则该方法应该起作用:
mask = pd.DataFrame(output.index.tolist,columns = ['a']).isin(date_list)
output[mask]
如果要在前面选择5个位置,请使用
np.argwhere(np.array(mask)==True) +5