pandas 如何根据索引在日期间隔之间的条件过滤 Dataframe ?

pdtvr36n  于 2022-12-21  发布在  其他
关注(0)|答案(2)|浏览(168)

我有2个 Dataframe :df_dec_光和df_拉力。

df_dec_light.head():
    log_return  month   year
1970-12-01  0.003092    12  1970
1970-12-02  0.011481    12  1970
1970-12-03  0.004736    12  1970
1970-12-04  0.006279    12  1970
1970-12-07  0.005351    12  1970
1970-12-08  -0.005239   12  1970
1970-12-09  0.000782    12  1970
1970-12-10  0.004235    12  1970
1970-12-11  0.003774    12  1970
1970-12-14  -0.005109   12  1970
df_rally.head():

rally_start rally_end
0   1970-12-18  1970-12-31
1   1971-12-17  1971-12-31
2   1972-12-15  1972-12-29
3   1973-12-21  1973-12-31
4   1974-12-20  1974-12-31

我需要根据df_dec_light. index介于df_rally ['rally_start']和df_rally ['rally_end']列的值之间的条件过滤df_dec_light。
我试过这样的方法:第一个月
我希望收到经过过滤的df_dec_light Dataframe ,其索引位于df_rail ['rail_start']和df_rail ['rail_end']之间的间隔内。

log_return  month   year
1970-12-18  0.001997    12  1970
1970-12-21  -0.003108   12  1970
1970-12-22  0.001111    12  1970
1970-12-23  0.000666    12  1970
1970-12-24  0.005644    12  1970
1970-12-28  0.005283    12  1970
1970-12-29  0.010810    12  1970
1970-12-30  0.002061    12  1970
1970-12-31  -0.001301   12  1970

真的很感激任何帮助谢谢!

s5a0g9ez

s5a0g9ez1#

让我们根据df_rally Dataframe 中的开始列值和结束列值创建一个IntervalIndex,然后根据df_dec_light Dataframe 的索引创建map间隔,并使用notna检查索引值是否包含在任何间隔中

ix = pd.IntervalIndex.from_arrays(df_rally.rally_start, df_rally.rally_end, closed='both')
mask = df_dec_light.index.map(ix.to_series()).notna()

然后使用mask过滤 Dataframe

df_dec_light[mask]
btqmn9zl

btqmn9zl2#

为了解决这个问题,我们可以首先通过在每一行上调用pd.date_range来将df_rally中的范围转换为pd.DateTimeIndex,这样我们就可以将df_rally的每一行转换为pd.DateTimeIndex
因为我们想稍后检查df_dec_light的索引是否在任何一个范围内,所以我们想合并所有这些范围,这是通过union完成的。
我们Assert新创建的pd.Seriesindex_list不为空,然后选择它的第一个元素,这个元素就是pd.DateTimeIndex,我们现在可以在它上面调用union和所有其他的pd.DateTimeIndex
现在我们可以使用pd.Index.isin创建一个布尔数组,以确定每个索引Date是否在传递的Date集中找到。
如果我们现在将这个掩码应用于df_dec_light,它只返回在df_rally的指定范围之一内的条目。

index_list = df_rally.apply(lambda x: pd.date_range(x['rally_start'], x['rally_end']), axis=1)
assert(not index_list.empty)
all_ranges=index_list.iloc[0]
for range in index_list:
    all_ranges=all_ranges.union(range)
print(all_ranges)
mask = df_dec_light.index.isin(all_ranges)
print(df_dec_light[mask])

相关问题