首页 > 解决方案 > 在多索引中扩展日期时间索引

问题描述

我想扩展一个多索引中的日期时间索引。但是,传递levelreindex不起作用。例如,这是一个具有多索引的系列。我想重新索引日期级别(日期时间索引),将其延长一个月。

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 。

标签: pythonpandas

解决方案


它看起来像错误,新值也在 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'])

可能的解决方案reindexMultiIndex

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,reindexstack:

s  = series.unstack().reindex(columns=new_date_idx).stack(dropna=False)

推荐阅读