根据日期时间索引转换数据框

时间:2018-10-06 15:45:05

标签: python pandas datetime

我有以下数据框:

date  = ['2014-02-03 23:00:00','2015-02-03 23:30:00','2015-02-04 00:00:00','2016-02-04 01:30:00'] 
value = [33.24  , 31.71  , 34.39  , 34.49  ]
df = pd.DataFrame({'value':value,'index':date})
df.index = pd.to_datetime(df['index'],format='%Y-%m-%d %H:%M')
df.drop(['index'],axis=1,inplace=True)
print(df.head())

                     value
index                     
2014-02-03 23:00:00  33.24
2015-02-03 23:30:00  31.71
2015-02-04 00:00:00  34.39
2016-02-04 01:30:00  34.49

我想有效地“旋转”数据框,因此必须具有以下结果:

                      2014   2015  2016
index                     
2014-02-03 23:00:00  33.24
2015-02-03 23:30:00         31.71
2015-02-04 00:00:00         34.39
2016-02-04 01:30:00                34.49

甚至更好地“折叠”上一个:

               2014   2015  2016
index                     
0             33.24  31.71  34.39
1                    34.39

我基本上想每年创建一列。您知道如何有效地做到这一点吗?

非常感谢,

1 个答案:

答案 0 :(得分:1)

您可以这样做:

pd.pivot(df.index,df.index.year, df.value)

index                 2014   2015   2016
index                                   
2014-02-03 23:00:00  33.24    NaN    NaN
2015-02-03 23:30:00    NaN  31.71    NaN
2015-02-04 00:00:00    NaN  34.39    NaN
2016-02-04 01:30:00    NaN    NaN  34.49

# If you want blank strings instead of `NaN`:
# pd.pivot(df.index,df.index.year, df.value).fillna('')

# index                 2014   2015   2016
# index                                   
# 2014-02-03 23:00:00  33.24              
# 2015-02-03 23:30:00         31.71       
# 2015-02-04 00:00:00         34.39       
# 2016-02-04 01:30:00                34.49

关于您的编辑,要“关闭”此内容,可以使用np.sort并创建新的数据框(如果顺序无关紧要)。不确定这是否是最有效的方法。

pd.DataFrame(np.sort(pd.pivot(df.index,df.index.year, df.value),0)).dropna(how='all')

       0      1      2
0  33.24  31.71  34.49
1    NaN  34.39    NaN