2014-10-22 16 views
5

Ich versuche, einen unstacked, Mehr indiziert Daten-Frame zurück zu einem einzelnen Pandas Datetime-Index zu konvertieren.Convert Pandas Multi-Index Pandas Zeitstempel

Der Index meiner ursprünglichen Daten-Frame, also vor dem Multi-Indizierung und Entstapeln, sieht wie folgt aus:

In [1]: df1_season.index 
Out [1]: 

<class 'pandas.tseries.index.DatetimeIndex'> 
[2013-05-01 02:00:00, ..., 2014-07-31 23:00:00] 
Length: 1472, Freq: None, Timezone: None 

dann wende ich die Multi-Indizierung und Entstapeln, damit ich die Jahresdaten plotten können auf der jeweils anderen wie folgt aus:

df_sort = df1_season.groupby(lambda x: (x.year, x.month, x.day, x.hour)).agg(lambda s: s[-1]) 
df_sort.index = pd.MultiIndex.from_tuples(df_sort.index, names=['Y','M','D','H']) 
unstacked = df_sort.unstack('Y') 

Meine neuen Datenrahmen für die ersten beiden Tagen des Monats Mai wie folgt aussieht:

In [2]: unstacked 
Out [2]: 

      temp  season   
Y  2013 2014 2013 2014 
M D H        
5 1 2 24.2 22.3 Summer Summer 
    8 24.1 22.3 Summer Summer 
    14 24.3 23.2 Summer Summer 
    20 24.6 23.2 Summer Summer 
    2 2 24.2 22.5 Summer Summer 
    8 24.8 22.2 Summer Summer 
    14 24.9 22.4 Summer Summer 
    20 24.9 22.8 Summer Summer 

736 rows × 4 columns 

Der Index für das neuen Datenrahmen oben nun gezeigt, sieht wie folgt aus:

In [2]: unstacked.index.values[0:8] 
Out [2]: 

array([(5, 1, 2), (5, 1, 8), (5, 1, 14), (5, 1, 20), (5, 2, 2), (5, 2, 8), (5, 2, 14), 
     (5, 2, 20], dtype=object) 

das nicht ein sehr schönes Grundstück in Bezug auf die xticks (Haupt- und Neben) erzeugt. Wenn ich diesen Multi-Index wieder in einen einzigen Pandas-Datetime-Index konvertieren kann, indem ich nur die Daten für Monat, Tag und Stunde verwende, werden die großen/kleinen Ticks automatisch so gezeichnet, wie ich es möchte (denke ich). Zum Beispiel:

aktuelle Lösung:

xticks = (5, 1, 2), (5, 1, 8) … (5, 2, 20) 

erforderlich Lösung:

xticks(major) = Day, Month (displayed as MAY 01, MAY 02 etc etc) 
xticks(minor) = Hour (displayed as 02h 08h … 20h) 
+0

Sogar ein kleiner Hinweis würde sehr geschätzt werden. – roi3i3ie

+0

Wie gehe ich vor, um diese Unterstützung zu erhalten? Es gibt einige Fragen über ein Jahr alt ohne Antworten. – roi3i3ie

+0

Noch ein Monat? Alles wird helfen ... – roi3i3ie

Antwort

0
import pandas as pd 
import matplotlib.pyplot as plt 
from numpy.random import randn 

ts = pd.Series(randn(1000), index=pd.date_range('1/1/2000', periods=1000)) 
ts = ts.cumsum() 

plt.figure() 
for year in set(ts.index.year): 
    tmp = ts[str(year)].values 
    plt.plot(tmp, label = year) 
plt.legend() 
plt.show() 

Ich denke, das ist ein besserer Weg, um Ihr Ziel als Neuindizierung zu erreichen. Was denken Sie?

+0

Hey!, Vielen Dank für die Antwort. Ok, ich habe es gerade gegeben. Ja, dies scheint ein viel einfacherer Weg zu sein, um jährliche Daten übereinander in einer Handlung zu stapeln/sortieren, also danke dafür. Es ist jedoch keine Lösung für die Frage. Statt meiner xticks, minor/major, die jährlich codiert sind (zB Tag-Monat-Stunde), werden sie jetzt in willkürliche Teile einzelner Datenpunkte zerlegt, Skalierung von 0 bis n-1, wobei n der Datenpunkt Nummer in meiner Messung ist Beispielset. – roi3i3ie

+0

Richtig, ich würde mir vorstellen, dass es zu diesem Zeitpunkt eine x_axis-Tick-Manipulation ist ... aber ich kann nicht herausfinden, wie genau ich das machen soll. Könntest du die Daten vielleicht irgendwo auf einen CSV laden, damit ich damit spielen und vielleicht einen anderen Beitrag dazu schreiben kann? Würde der beste Ausdruck dafür ein "Saisonalitäts-Plot" sein - nehmen Sie Informationen aus mehreren Jahren und plotten sie auf einer Jan-Dec-Achse? Ich kann keine Dokumentation darüber finden, wie das zu tun ist, was für mich überraschend ist – EngineeredE

+0

Hey! Ich war weg, Entschuldigung für die Verspätung. Lassen Sie mich darauf zurückkommen. Ich werde dir auch einen CSV bringen. Ja zu deiner Frage auch. Genau darum geht es in der Handlung. – roi3i3ie

1

Das Konvertieren von Daten in Pandas wird sehr schnell unordentlich, wie Sie es anscheinend erlebt haben. Meine generelle Empfehlung bezüglich Pandas und Indexierung besteht darin, niemals nur den Index zu setzen, sondern ihn zuerst zu kopieren. Stellen Sie sicher, dass Sie eine Spalte haben, die den Index enthält, da Pandas nicht alle Operationen auf dem Index zulässt, und intensive Einstellung und das Zurücksetzen des Indexes dazu führen können, dass Spalten verschwinden.

TLDR; Konvertieren Sie den Index nicht zurück. Behalte eine Kopie.

+0

Dies gilt auch für das Prinzip open/closed: http://en.wikipedia.org/wiki/Open/closed_principle – firelynx