2017-07-21 3 views
2

Ich habe Multi-Index df wie folgtParse Pandas (multi) Index in Datetime

   x y 
id date    
abc 3/1/1994 100 7 
    9/1/1994 90 8 
    3/1/1995 80 9 

Wo Daten als str gespeichert sind.

Ich möchte Datumsindex analysieren. Die folgende Anweisung

df.index.levels[1] = pd.to_datetime(df.index.levels[1]) 

kehrt Fehler:

TypeError: 'FrozenList' does not support mutable operations. 
+2

Bitte, beim nächsten Mal Pandas Frage zu stellen, sollten Sie folgende [diese ausgezeichnete Anleitung] (https://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples) um Ihre Beispiele reproduzierbar zu machen (wie einer in meiner Antwort). –

Antwort

1

Wie bereits erwähnt, können Sie den Index neu erstellen:

df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])]) 
0

Man kann nicht ändern MultiIndex an Ort und Stelle, so haben wir es neu zu erstellen. Dazu verwenden wir get_level_values, um Multiindex-Ebenen wie Series zu erhalten, wenden Sie dann pd.to_datefime an und rekonstruieren Sie dann den Multiindex aus zwei Ebenen.

index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994')], 
           names=('id', 'date')) 
df = pd.DataFrame({'x': [1, 2]}, index=index) 
print(df.index.get_level_values(level=1).dtype) 
# object 

df.index = pd.MultiIndex.from_arrays([index.get_level_values(level=0), 
             pd.to_datetime(
              index.get_level_values(level=1))]) 
print(df.index.get_level_values(level=1).dtype) 
# datetime64[ns] 
1

Sie können es nicht direkt ändern. Sie können pandas.MultiIndex.map verwenden, um einen neuen Index zu erstellen und dann zuweisen:

new_tuples = df.index.map(lambda x: (x[0], pd.to_datetime(x[1]))) 
df.index = pd.MultiIndex.from_tuples(new_tuples, names=["id", "date"]) 
Verwandte Themen