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

如何将非堆叠多重索引DataFrame转换为DateTimeIndex单索引?

问题描述

我有一个初始的以DateTimeIndex为索引的DataFrame:

import pandas as pd
import numpy as np
np.random.seed(0)
timeindex = pd.date_range('8/12/2022', '8/18/2022', freq='min')
df = pd.DataFrame(np.random.randn(len(timeindex)), columns=['value'], index=timeindex)
print(df.head())

输出:

value
2022-08-12 00:00:00  1.764052
2022-08-12 00:01:00  0.400157
2022-08-12 00:02:00  0.978738
2022-08-12 00:03:00  2.240893
2022-08-12 00:04:00  1.867558

之后我将其转换为以时间为行索引、日期为列的结构:

df = df.set_index([df.index.date, df.index.time]).unstack(level=0)
print(df.head())

输出:

value                                                         
         2022-08-12 2022-08-13 2022-08-14 2022-08-15 2022-08-16 2022-08-17   
00:00:00   1.764052   0.147434  -0.691020   0.718456   1.198187  -0.088724   
00:01:00   0.400157  -0.977465  -2.205505   1.576193  -0.336650   1.512770   
00:02:00   0.978738   0.879390   0.447870   0.441869   0.841947   0.573708   
00:03:00   2.240893   0.635425  -0.755751  -0.816861   0.543372  -0.541004   
00:04:00   1.867558   0.542611   1.325708   0.745505  -0.962988   0.101177   

现在我想把这个结构转回最初的DateTimeIndex形式,尝试了df.unstack()但不知道如何合并日期和时间:

df.unstack()

输出:

value  2022-08-12  00:00:00    1.764052
                   00:01:00    0.400157
                   00:02:00    0.978738
                   00:03:00    2.240893
                   00:04:00    1.867558

请问该如何实现转换?

解决方案

可以通过以下步骤恢复初始结构:

  1. 将日期列重新转为行索引:使用stack(level=1)把日期从列层级转到行索引,得到一个多层索引(时间、日期)的Series:
df_stacked = df.stack(level=1)
  1. 合并日期与时间为DateTimeIndex:把多层索引中的日期和时间拼接成完整的datetime,替换原索引:
# 提取日期和时间层级,转换为字符串后拼接,再转为datetime
df_stacked.index = pd.to_datetime(
    df_stacked.index.get_level_values(1).astype(str) + ' ' + 
    df_stacked.index.get_level_values(0).astype(str)
)
  1. 恢复为原始DataFrame结构:将Series转为DataFrame并设置列名:
result = df_stacked.rename_axis('datetime').to_frame('value')

完整代码:

# 转换回初始结构
df_stacked = df.stack(level=1)
df_stacked.index = pd.to_datetime(
    df_stacked.index.get_level_values(1).astype(str) + ' ' + 
    df_stacked.index.get_level_values(0).astype(str)
)
result = df_stacked.rename_axis('datetime').to_frame('value')

# 查看结果
print(result.head())

输出会和初始的DataFrame一致:

value
datetime                  
2022-08-12 00:00:00  1.764052
2022-08-12 00:01:00  0.400157
2022-08-12 00:02:00  0.978738
2022-08-12 00:03:00  2.240893
2022-08-12 00:04:00  1.867558

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:18:55