如何使用列名年份与索引日/月将值重索引为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
相关产品推荐
相关产品推荐

