2017-11-14 1 views
3

Die docs auf pandas.PeriodIndex das folgende Beispiel für den Bau geben:Constructing PeriodIndex aus zwei int64 Spalten

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

Und die Typen für diese beiden Parameter angeben:

Jahr: int, Array oder Serie, Standardwert Keine

Monat: int, ein Array oder Serien, default Keine

Aber ich laufe in eine Typeerror versuchen, diese Art der Konstruktion zu verwenden.

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()) 

Bonus Frage: Kann ich die Ebenen eines Multiindex entpacken? Zur Zeit habe ich

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

Gibt es eine vorgeschriebene Methode, um eine iterable von den Ebenen des Index zu bekommen?

Arbeiten in: Pandas 0.20.3.

Antwort

2

können Sie erhalten diese explizit zu arbeiten, um die Frequenz String angibt und vorbei in Listen/Tupeln:

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

Oder alternativ Auspacken mit 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') 

nicht sicher, warum es nicht ist Arbeiten mit einem Index oder numpy Array. Wahrscheinlich ein Fehler.

+0

Wahrscheinlich ein Bug yeah - PeriodIndex scheint eine Reihe von Problemen zu haben IMHO. – miradulo

+1

@miradulo Ja, ich hatte das gleiche Problem vor ... https: //github.com/pandas-dev/pandas/issues/7701 – Wen