2017-11-13 9 views
1

タイムパネル(年に一度、毎月、毎月、毎月、毎月)で値をキャプチャするパンダデータフレームがあります。パンダの時系列データフレームから季節データフレームを生成するための「ピジョンソニック」方法

""" no guarantee that this index will have an entry for every month of the time range!""" 
dates = pd.date_range('1/1/2015', periods=36, freq='M') 
df = pd.DataFrame(index = dates) 
df['value'] = df.index.year * 0.1 + df.index.month * 0.05 
df.plot() 

それはプロットに私に

enter image description here を、単純な時系列を与える。しかし、私がしたいことはあることができます(一部ヶ月は一年で失われている場合があります)時系列が連続しているという保証はありません「季節」プロット。これは、毎月の同じインデックスの異なる行として、毎年のデータを表示します。シンプルとして表示:

import numpy as np 
index = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'] 
df = pd.DataFrame(index = index) 
df[2015] = np.arange(12)*0.4+1 
df[2016] = np.arange(12)*0.35+1.4 
df[2017] = np.arange(12)*0.5+1.2 

df.plot() 

enter image description here

私は、この操作を行うには、「ニシキヘビ」やエレガントな方法を探しています。変換しようとする私の試みは、信じられないほど総体的な、スパゲティ、ガーベージコードでした。私は、この変換を効率的かつきれいに表示するために、pandas/pythonを使って整然としたアプローチをしなければならないと確信しています。特に、私はこれを行うための抽象的な方法を探したいので、月など

まずは、このグラフを作成して基礎とするのに良いインデックスが何であるかわかりません。

答えて

2

あなたはDatetimeIndex.strftimeDatetimeIndex.year、正しい順序で使用sorted CategoricalIndexのために使用することができ、最後のリシェイプpivotによって:

c = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 

df = pd.pivot(index=pd.CategoricalIndex(df.index.strftime('%b'), ordered=True, categories=c), 
       columns=df.index.year, 
       values=df['value']) 
print (df) 

     2015 2016 2017 
Jan 201.55 201.65 201.75 
Feb 201.60 201.70 201.80 
Mar 201.65 201.75 201.85 
Apr 201.70 201.80 201.90 
May 201.75 201.85 201.95 
Jun 201.80 201.90 202.00 
Jul 201.85 201.95 202.05 
Aug 201.90 202.00 202.10 
Sep 201.95 202.05 202.15 
Oct 202.00 202.10 202.20 
Nov 202.05 202.15 202.25 
Dec 202.10 202.20 202.30 

df.plot() 
+0

驚くべき - 迅速かつクリーンな - あなたは歓迎されている – user3556757

+0

感謝!これはきれいなので、私は最初の解決策を削除します;) – jezrael

関連する問題