从两个int64列构造PeriodIndex

时间:2017-11-14 15:39:07

标签: python python-3.x pandas

pandas.PeriodIndex上的文档给出了以下构造示例:

  

>>> idx = PeriodIndex(year=year_arr, quarter=q_arr)

并指定这两个参数的类型:

  

:int,array或Series,默认无

     

:int,array或Series,默认无

但是我遇到了一个试图使用这种结构的TypeError。

import numpy as np
import pandas as pd

# (Year, Month) MultiIndex'd DataFrame
idx = pd.MultiIndex.from_product(([2017, 2016], range(1, 13)))
df = pd.DataFrame(np.random.randn(24, 2), index=idx, columns=['a', 'b'])

print(df.head())
               a         b
2017 1  0.406534 -0.516329
     2 -0.687286 -0.066606
     3  1.493217  0.539294
     4  2.069313  0.415216
     5 -0.212414 -1.375707

# Seems to mimic the construction example from the docs above:
pd.PeriodIndex(year=df.index.get_level_values(0),
               month=df.index.get_level_values(1))
# TypeError: expected string or bytes-like object

# Same issue even if I specify inputs as NumPy arrays or lists
pd.PeriodIndex(year=df.index.get_level_values(0).values,
               month=df.index.get_level_values(1).values)
pd.PeriodIndex(year=df.index.get_level_values(0).tolist(),
               month=df.index.get_level_values(1).tolist())

奖金问题:我可以解压缩MultiIndex的级别吗?现在我有

year, month = list(zip(*df.index.get_values()))

是否有规定的方法从索引的级别获取可迭代的内容?

工作:pandas 0.20.3。

1 个答案:

答案 0 :(得分:2)

您可以通过明确指定频率字符串并传入列表/元组来实现此目的:

In [10]: pd.PeriodIndex(year=df.index.get_level_values(0).tolist(),
    ...:                month=df.index.get_level_values(1).tolist(), freq='M')
    ...:
Out[10]:
PeriodIndex(['2017-01', '2017-02', '2017-03', '2017-04', '2017-05', '2017-06',
             '2017-07', '2017-08', '2017-09', '2017-10', '2017-11', '2017-12',
             '2016-01', '2016-02', '2016-03', '2016-04', '2016-05', '2016-06',
             '2016-07', '2016-08', '2016-09', '2016-10', '2016-11', '2016-12'],
            dtype='period[M]', freq='M')

或者使用zip解压缩:

In [11]: pd.PeriodIndex(year,month=zip(*df.index.get_values()), freq='M')
Out[11]:
PeriodIndex(['2017-01', '2017-01', '2017-01', '2017-01', '2017-01', '2017-01',
             '2017-01', '2017-01', '2017-01', '2017-01', '2017-01', '2017-01',
             '2016-01', '2016-01', '2016-01', '2016-01', '2016-01', '2016-01',
             '2016-01', '2016-01', '2016-01', '2016-01', '2016-01', '2016-01'],
            dtype='period[M]', freq='M')

不确定为什么它不能使用Index或numpy数组。可能是一个错误。