Pandas:移除多层索引指定层级的时间戳,仅保留日期
解决Pandas多层索引时间格式统一问题
咱先把问题拆解清楚:你的多层索引里,时间层既有纯日期字符串,又有带时分秒的时间戳,目标是统一成YYYY-MM-DD的纯日期格式,同时把索引拆成单独的Date、Name列,对吧?下面给你一步步搞定的方案:
步骤1:构造示例数据(方便你测试)
先把你给出的混乱索引DataFrame还原出来,方便后续操作:
import pandas as pd # 还原你的示例DataFrame data = {'Count': [1, 3, 5, 7, 9]} raw_index = pd.MultiIndex.from_tuples( [ ('2020-01-01', 'ABC1'), ('2019-04-11 00:00:00', 'ABC2'), ('2020-04-15 00:00:00', 'ABC3'), ('2019-10-29', 'ABC4'), ('2019-08-10', 'ABC5') ] ) df = pd.DataFrame(data, index=raw_index)
步骤2:清洗时间索引并重构DataFrame
核心思路是用Pandas的to_datetime自动识别各种时间格式,然后提取纯日期部分:
# 先把多层索引转换成普通列,方便处理 df_reset = df.reset_index() # 处理时间列:统一转成datetime后提取纯日期,再转成字符串 df_reset['level_0'] = pd.to_datetime(df_reset['level_0']).dt.date.astype(str) # 给列重命名,和你的期望输出匹配 df_reset.rename(columns={'level_0': 'Date', 'level_1': 'Name'}, inplace=True) # 调整列顺序,和目标输出一致 final_df = df_reset[['Date', 'Name', 'Count']]
最终输出
运行完上面的代码后,final_df就是你要的结果:
| Date | Name | Count |
|---|---|---|
| 2020-01-01 | ABC1 | 1 |
| 2019-04-11 | ABC2 | 3 |
| 2020-04-15 | ABC3 | 5 |
| 2019-10-29 | ABC4 | 7 |
| 2019-08-10 | ABC5 | 9 |
注:你给出的期望输出里ABC4的日期是
2019-10-24,但原数据里是2019-10-29,代码会按原数据处理,要是需要修改可以直接调整原数据或者用final_df.loc[final_df['Name'] == 'ABC4', 'Date'] = '2019-10-24'手动替换。
内容的提问来源于stack exchange,提问作者Zizzipupp
相关产品推荐
相关产品推荐

