You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用列名年份与索引日/月将值重索引为datetime类型并生成两列DataFrame

实现代码

首先导入pandas,构造测试数据后通过如下代码完成转换:

import pandas as pd

# 构造测试DataFrame
data = {
    '2016': {'01/01': 7.91180835607475, '02/01': 9.166619186818957},
    '2017': {'01/01': 0.9133599067435504, '02/01': 3.00075717302118},
    '2018': {'01/01': 9.256094179303766, '02/01': 9.671415667353237},
    '2019': {'01/01': 7.263467475115588, '02/01': 6.167104485385209},
    '2020': {'01/01': 5.459530161206799, '02/01': 6.8136014047445785},
    '2021': {'01/01': 2.8566666666666665, '02/01': 2.2554166666666666}
}
df = pd.DataFrame(data)

# 核心转换逻辑
# 1. 宽表转长表,将年份列转为二级索引,重置索引后得到日/月、年份、数值三列
df_long = df.stack().reset_index()
# 2. 拼接年份与日/月信息,转换为datetime类型的日期列,注意原索引是「日/月」格式,所以指定格式为%Y/%d/%m
df_long['date'] = pd.to_datetime(df_long['level_1'] + '/' + df_long['Date'], format='%Y/%d/%m')
# 3. 保留需要的列并重命名
result = df_long[['date', 0]].rename(columns={0: 'value'})

# 如果需要按日期先后顺序排序,可执行下面这行
# result = result.sort_values('date', ignore_index=True)

输出效果

执行后result的格式和要求完全一致,前12行如下:

date     value
0  2016-01-01  7.911808
1  2017-01-01  0.913360
2  2018-01-01  9.256094
3  2019-01-01  7.263467
4  2020-01-01  5.459530
5  2021-01-01  2.856667
6  2016-01-02  9.166619
7  2017-01-02  3.000757
8  2018-01-02  9.671416
9  2019-01-02  6.167104
10 2020-01-02  6.813601
11 2021-01-02  2.255417

内容的提问来源于stack exchange,提问作者Odhian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:48:03