将pandas multi-index转换为pandas时间戳

时间:2014-10-22 10:12:07

标签: datetime pandas plot dataframe

我正在尝试将未堆叠多索引数据框转换回单个 pandas日期时间索引。< / p>

我的原始数据框的索引,即在多索引和取消堆栈之前的索引如下所示:

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

然后我应用了多索引和取消堆栈,因此我可以将年度数据绘制在彼此之上:

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

5月上两天的数据框架如下所示:

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 

上面显示的数据框的索引现在如下所示:

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)

对于xticks(主要和次要)没有产生非常好的情节。如果我可以将这个多索引转换回单个pandas datetime索引,只使用月,日和小时数据,那么主要/次要刻度将按照我想要的方式自动绘制(我认为)。例如:

目前的解决方案:

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

所需的解决方案:

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

3 个答案:

答案 0 :(得分:1)

在大熊猫中来回转换数据变得非常麻烦,正如您似乎经历过的那样。 我对pandas和索引的一般建议是,不要只设置索引,而是先复制它。确保你有一个包含索引的列,因为pandas不允许对索引进行所有操作,并且强烈设置和重置索引会导致列消失。

TLDR; 不要将索引转换回来。保留一份副本。

答案 1 :(得分: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()

我认为这是实现目标的一种更好的方法,而不是重新编制索引。你觉得怎么样?

答案 2 :(得分:0)

在这里回答:Pandas multi index to datetime

df1_season.index = df1_season.index.to_frame()