如何在Pandas中匹配日期区间并提取关联Items数据?
问题解决:Pandas DataFrame关联历史数据与消耗数据
问题背景
现有两个Pandas DataFrame:历史数据hist和消耗数据consume,定义如下:
import pandas as pd hist = pd.DataFrame({'date':['Jan1','Jan2', 'Jan3', 'Jan4'], 'Items':[['A','V'], ['D','C'],['F','X'],['Q','H']]})
consume = pd.DataFrame({'date':['Jan2','Jan4'], 'values':[100, 50]}) consume['delta'] = consume['values'].diff()
consume表初始数据:
| date | values | delta |
|---|---|---|
| Jan2 | 100 | NaN |
| Jan4 | 50 | -50 |
需求
提取Jan2到Jan3(不含Jan4)的所有Items,将其对应到consume表中Jan4行的delta记录,最终得到目标表:
| date | values | delta | item_consumed |
|---|---|---|---|
| Jan2 | 100 | NaN | NaN |
| Jan4 | 50 | -50 | [D,C,F,X] |
解决方案
直接通过两步操作即可实现需求:
# 1. 筛选Jan2到Jan3的Items并合并成一个列表 target_items = hist[(hist['date'] >= 'Jan2') & (hist['date'] < 'Jan4')]['Items'].sum() # 2. 给consume新增列并赋值 consume['item_consumed'] = pd.NA consume.loc[consume['date'] == 'Jan4', 'item_consumed'] = [target_items] # 查看结果 print(consume)
运行后输出结果:
date values delta item_consumed 0 Jan2 100 NaN <NA> 1 Jan4 50 -50.0 [D, C, F, X]
代码说明
- 利用字符串比较筛选目标日期区间:因为日期是
JanX格式,直接用>=和<就能完成区间判断 - 通过
.sum()合并多行列表:把['D','C']和['F','X']直接合并成一个完整列表 - 先初始化
item_consumed列为缺失值,再通过loc精准定位Jan4行赋值,避免其他行被污染
如果你的日期格式更复杂(比如带年份),建议先把date列转为日期类型再筛选:
# 转换日期格式 hist['date'] = pd.to_datetime(hist['date'], format='%b%d') consume['date'] = pd.to_datetime(consume['date'], format='%b%d') # 按日期区间筛选 target_items = hist[(hist['date'] >= '2024-01-02') & (hist['date'] <= '2024-01-03')]['Items'].sum()
内容的提问来源于stack exchange,提问作者Learning
相关产品推荐
相关产品推荐

