将pandas多重索引转换为pandas时间戳。

6

我正在尝试将一个未堆叠的、多索引的数据框转换回一个单独的pandas日期时间索引。

我的原始数据框的索引,在进行多索引和取消堆叠之前,看起来像这样:

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

我五月前两天的数据框架如下:

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)

当前解决方案:

由于x轴刻度(主要和次要)的问题,绘制出来的图形效果不是很好。如果我可以将这个多级索引转换回仅使用月份、日期和小时数据的单个Pandas日期时间索引,则主/次要刻度将自动绘制出我所期望的方式(我想)。例如:

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)

即使只有一点提示,也将不胜感激。 - roi3i3ie
我该如何提高这个问题的支持度?这里有一些超过一年没有回答的问题。 - roi3i3ie
又一个月了?任何帮助都会有所帮助... - roi3i3ie
你想要自动完成这个操作的原因是什么?我可能会写一个函数来自定义生成x轴标签。这听起来比你想要的更快。 - mnky9800n
谢谢您的回复。也许您是对的,我只需要在缩放时保持合理的比例。我知道使用这种方法可以解决这个问题。 - roi3i3ie
3个回答

1
将数据在pandas中来回转换会变得非常混乱,可能您已经有过这样的经历。 我的一般建议是关于pandas和索引的,永远不要只设置索引,而是先复制它。确保有一列包含索引,因为pandas不允许对索引进行所有操作,强烈的设置和重置索引可能导致列消失。
简而言之,不要将索引转换回去。保留一份副本。

这也符合开放/封闭原则: http://zh.wikipedia.org/wiki/开放-封闭原则 - firelynx

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

我认为这种方法比重新索引更好地实现了您的目标。您觉得呢?


嘿!非常感谢您的回复。好的,我刚刚尝试了一下。是的,这似乎是将年度数据堆叠/排序到一个图中的更简单的方法,所以谢谢您。但是,这不是问题的解决方案。我的xticks,次要/主要,不再是按年编码(例如日月小时),而是被分解为任意的单个数据点块,从0到n-1进行缩放,其中n是我的测量样本集中的数据点数。 - roi3i3ie
正确,我想在那个时候它是一个x轴刻度操作...但是我无法确切地弄清楚如何做到这一点。也许您可以将数据加载到某个CSV中,以便我可以玩耍,也许可以在此基础上创建另一篇帖子吗?这个最好的术语是“季节性图”,将多年的信息提取出来,并绘制在一个1月到12月的轴上?我找不到任何关于如何做到这一点的文档,这让我感到惊讶。 - EngineeredE
嘿!我有些忙,抱歉回复晚了。让我回到你的问题上。我也会给你一个csv文件。对于你的问题是肯定的。这正是情节的全部内容。 - roi3i3ie
好的,这里是源文件的链接。我还包括了一个小程序,这样你就可以有一个真实的例子来玩耍。如果你启动脚本,你会看到两个图形。图1是请求的年度堆叠数据,但刻度线很糟糕。图2是请求的刻度线,但没有年度堆叠。 - roi3i3ie

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接