如何用Pandas按指定时间间隔筛选数据并重构列输出格式
问题
现有包含周度间隔数据的Pandas DataFrame(名称为inndata),数据结构如下(日期列存在合并单元格空值):
| 日期 | 项目 | X | Y | Z |
|---|---|---|---|---|
| 12-21-2021 | aa | -100 | 50 | -50 |
| bb | 100 | 100 | 200 | |
| cc | 300 | -50 | 250 | |
| 12-28-2021 | aa | 75 | -50 | 25 |
| bb | -75 | -50 | -125 | |
| cc | 50 | 100 | 150 | |
| ... | ... | ... | ... | ... |
| 12-20-2022 | aa | 200 | 55 | 255 |
| bb | -25 | -50 | -75 | |
| cc | -100 | 100 | 0 |
需要按指定时间间隔(1周、1年)筛选对应行数据,提取Z列生成如下格式的结果:
| 项目 | 1W | 1YR |
|---|---|---|
| aa | -50 | 255 |
| bb | 200 | -75 |
| cc | 250 | 0 |
以下是尝试但未成功的代码:
inndata['Z'] = pd.DataFrame({ '1W': df.iloc[0,:] ,'1YR': df.iloc[-52,:] }).T
解决方案
步骤1:填充日期列空值
原DataFrame的日期列因合并单元格存在空值,需先向前填充,让每个项目行对应正确的日期:
inndata['日期'] = inndata['日期'].ffill()
步骤2:转换日期为datetime类型
将日期字符串转为Pandas可识别的datetime格式,方便后续时间筛选:
inndata['日期'] = pd.to_datetime(inndata['日期'], format='%m-%d-%Y')
步骤3:筛选指定时间点的数据
这里「1W」对应最早的周度数据,「1YR」对应最晚的周度数据(即一年后的最后一组数据),先定位这两个日期:
earliest_date = inndata['日期'].min() latest_date = inndata['日期'].max() # 筛选这两个日期的所有行 filtered_data = inndata[inndata['日期'].isin([earliest_date, latest_date])]
步骤4:重塑为目标格式
使用pivot方法将数据转换为项目作为行、时间间隔作为列的结构,并重命名列名:
result = filtered_data.pivot(index='项目', columns='日期', values='Z') result.columns = ['1W', '1YR'] # 按早到晚的顺序对应1W和1YR
执行后result即为目标格式的DataFrame,输出后与需求表格一致。
原代码问题说明
- 错误使用了未定义的
df变量(应为inndata) iloc[0,:]和iloc[-52,:]仅提取单行数据,无法覆盖所有项目的对应时间点数据- 赋值逻辑错误,直接修改
inndata['Z']会破坏原数据结构,且无法生成目标的多列格式
内容的提问来源于stack exchange,提问作者SJ1
相关产品推荐
相关产品推荐

