如何将非堆叠多重索引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
请问该如何实现转换?
解决方案
可以通过以下步骤恢复初始结构:
- 将日期列重新转为行索引:使用
stack(level=1)把日期从列层级转到行索引,得到一个多层索引(时间、日期)的Series:
df_stacked = df.stack(level=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) )
- 恢复为原始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
相关产品推荐
相关产品推荐

