如何将日历年份设为列名、月日设为月度股票时间序列的索引?
解决方案
核心思路:用Pandas的pivot方法实现数据重塑
这种月度数据的行列转换,用pivot是最高效的方式,无需复杂循环或groupby嵌套。
步骤说明
- 预处理日期列:从原始日期中提取两个关键字段——年份(作为最终表格的列名)、月日(作为最终表格的索引,统一格式为
MM-DD)。 - 执行数据重塑:通过
pivot方法直接指定行、列、值的对应关系完成转换。
完整示例代码
假设你的原始数据集包含date(日期)和price(股票价格)两列:
import pandas as pd # 替换为你的实际数据读取逻辑(如pd.read_csv) df = pd.DataFrame({ 'date': ['2021-01-01', '2021-02-01', '2021-12-01', '2022-01-01', '2022-02-01', '2022-12-01', '2023-01-01', '2023-02-01', '2023-12-01'], 'price': [100, 105, 120, 110, 112, 130, 125, 128, 145] }) # 转换日期为datetime格式 df['date'] = pd.to_datetime(df['date']) # 提取年份和月日字段 df['year'] = df['date'].dt.year.astype(str) df['month_day'] = df['date'].dt.strftime('%m-%d') # 执行数据重塑 result = df.pivot(index='month_day', columns='year', values='price') # 按月份顺序排序索引 result = result.sort_index() print(result)
输出效果(匹配你的目标)
| month_day | 2021 | 2022 | 2023 |
|---|---|---|---|
| 01-01 | 100 | 110 | 125 |
| 02-01 | 105 | 112 | 128 |
| ... | ... | ... | ... |
| 12-01 | 120 | 130 | 145 |
额外提示
- 若原始日期格式不标准,先通过
pd.to_datetime()统一转换; - 若存在重复年月的价格数据,改用
pivot_table并指定aggfunc(如aggfunc='mean'取平均值)处理; - 如需中文格式索引(如“01月01日”),将
strftime('%m-%d')替换为strftime('%m月%d日')即可。
内容的提问来源于stack exchange,提问作者Gerry
相关产品推荐
相关产品推荐

