我有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
真的很感激任何帮助谢谢!
2条答案
按热度按时间s5a0g9ez1#
让我们根据
df_rally
Dataframe 中的开始列值和结束列值创建一个IntervalIndex
,然后根据df_dec_light
Dataframe 的索引创建map
间隔,并使用notna
检查索引值是否包含在任何间隔中然后使用
mask
过滤 Dataframebtqmn9zl2#
为了解决这个问题,我们可以首先通过在每一行上调用
pd.date_range
来将df_rally
中的范围转换为pd.DateTimeIndex
,这样我们就可以将df_rally
的每一行转换为pd.DateTimeIndex
。因为我们想稍后检查
df_dec_light
的索引是否在任何一个范围内,所以我们想合并所有这些范围,这是通过union
完成的。我们Assert新创建的
pd.Series
index_list
不为空,然后选择它的第一个元素,这个元素就是pd.DateTimeIndex
,我们现在可以在它上面调用union
和所有其他的pd.DateTimeIndex
。现在我们可以使用
pd.Index.isin
创建一个布尔数组,以确定每个索引Date是否在传递的Date集中找到。如果我们现在将这个掩码应用于
df_dec_light
,它只返回在df_rally
的指定范围之一内的条目。