python - 在多索引中扩展日期时间索引
问题描述
我想扩展一个多索引中的日期时间索引。但是,传递level
给reindex
不起作用。例如,这是一个具有多索引的系列。我想重新索引日期级别(日期时间索引),将其延长一个月。
import numpy as np
import pandas as pd
category_idx = pd.Index(['A', 'B'])
date_idx = pd.date_range('2018-01', '2018-02', freq='MS')
idx = pd.MultiIndex.from_product([category_idx, date_idx], names=['category', 'date'])
series = pd.Series(np.random.randn(len(category_idx) * len(date_idx)), index=idx)
series
# category date
# A 2018-01-01 1.052776
# 2018-02-01 -0.032686
# B 2018-01-01 1.745934
# 2018-02-01 -0.759375
# dtype: float64
这是新的日期级别,延长了一个月。
new_date_idx = date_idx.union([date_idx[-1] + date_idx.freq])
new_date_idx
# DatetimeIndex(['2018-01-01', '2018-02-01', '2018-03-01'], dtype='datetime64[ns]', freq='MS')
我希望以下内容显示该系列有两个新行,每个包含NaN
. 然而,一切都没有改变。
series.reindex(index=new_date_idx, level='date')
# category date
# A 2018-01-01 1.052776
# 2018-02-01 -0.032686
# B 2018-01-01 1.745934
# 2018-02-01 -0.759375
# dtype: float64
我希望该行为与重新索引索引相同。
# series.loc['A'].reindex(index=new_date_idx)
# 2018-01-01 1.052776
# 2018-02-01 -0.032686
# 2018-03-01 NaN
# Freq: MS, dtype: float64
更新:我已将此问题作为 Pandas 的问题提出:https ://github.com/pandas-dev/pandas/issues/25460 。
解决方案
它看起来像错误,新值也在 new 中MultiIndex
,只是没有添加代码:
s = series.reindex(index=new_date_idx, level='date')
print (s.index)
MultiIndex(levels=[['A', 'B'], [2018-01-01 00:00:00,
2018-02-01 00:00:00,
2018-03-01 00:00:00]],
codes=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=['category', 'date'])
可能的解决方案reindex
是MultiIndex
:
mux = pd.MultiIndex.from_product([series.index.levels[0], new_date_idx],
names=series.index.names)
s = series.reindex(mux)
print (s)
category date
A 2018-01-01 0.125677
2018-02-01 0.623794
2018-03-01 NaN
B 2018-01-01 0.175913
2018-02-01 0.711070
2018-03-01 NaN
dtype: float64
print (s.index)
MultiIndex(levels=[['A', 'B'], [2018-01-01 00:00:00,
2018-02-01 00:00:00,
2018-03-01 00:00:00]],
codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
names=['category', 'date'])
或unstack
,reindex
和stack
:
s = series.unstack().reindex(columns=new_date_idx).stack(dropna=False)
推荐阅读
- git - 在一个分支上提交更改是否会从其他分支中丢弃它们?
- r - 使用 facet_grid 更改标签的问题
- payara - Payara 服务器无法启动,需要主密码才能启动服务器
- react-native - 如何在反应中使用导航,这将适用于网络和移动设备?
- mfc - 如何使用 MFC 对对话框进行多行单选控件
- python - 为什么 != 不起作用,当函数不应该让其他文本
- java - Project Reactor - 长期运行的反应式 Kafka 消费者
- typescript - 创建助手类时在分配之前使用变量
- visual-studio-code - Tailwind CSS IntelliSense for VS Code 给了我另一个项目的建议
- python - Telethon client.conversation() 不起作用