在多索引中扩展日期时间索引

时间:2019-02-27 11:57:50

标签: python pandas

我想扩展多索引内的日期时间索引。但是,无法将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


更新:我已经将此问题作为熊猫的问题提出:https://github.com/pandas-dev/pandas/issues/25460

1 个答案:

答案 0 :(得分:0)

看起来像个错误,新的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的{​​{1}}:

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']) unstackreindex

stack