Datetime 将pandas多索引转换为pandas时间戳

Datetime 将pandas多索引转换为pandas时间戳,datetime,pandas,plot,dataframe,Datetime,Pandas,Plot,Dataframe,我正在尝试将一个未堆叠的,多索引的数据帧转换回一个单一的日期时间索引 我的原始数据帧的索引,即在多重索引和取消堆叠之前,如下所示: 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

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

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

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 
我的5月前两天的新数据框架如下所示:

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)
对于XTICK(大调和小调),这不会产生一个非常好的图。如果我可以将这个多索引转换回一个单独的日期时间索引,只使用月、日和小时数据,那么主/次刻度将以我想要的方式自动绘制(我认为)。例如:

当前解决方案:

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)
所需解决方案:

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)

我认为这是一种比重新编制索引更好的实现目标的方法。你认为呢?

在熊猫中来回转换数据会变得非常混乱,就像你所经历的那样。 一般来说,关于索引和索引,我的建议是永远不要只设置索引,而是先复制它。确保您有一个包含索引的列,因为pandas不允许对索引进行所有操作,并且索引的密集设置和重置可能会导致列消失

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

回答如下:


df1_seasure.index=df1_seasure.index.to_frame()

哪怕是一点提示都将不胜感激。我该如何将此添加到支持中?这里有一些一岁多的问题没有答案。还有一个月吗?任何事情都会有帮助…你有什么理由想“自动神奇地”做这件事吗?我可能只需要编写一个函数来定制生成x标签。听起来比你想要的要快。谢谢他的回复。也许你是对的,只是放大时我需要保持一个合理的比例。我知道用这种方法会处理好的。嘿!,非常感谢你的回复。好的,我刚试过。是的,这似乎是一种更简单的方法,可以将年度数据叠加/排序到一个图中,谢谢。然而,这并不能解决这个问题。我的XTick,minor/major,不是每年编码一次(例如,日-月-小时),而是被分解成任意块的单个数据点,从0扩展到n-1,其中n是我的测量样本集中的数字数据点。对,我可以想象在那一点上它是一个x_轴刻度操作。。。但我不知道该怎么做。你能不能把数据加载到某个地方的csv上,这样我就可以玩它,或者在这上面再写一篇文章?最好的术语是“季节性图”——从多年中获取信息,并将其绘制在一个1-12轴上?我找不到任何关于如何做到这一点的文档,这让我很惊讶!我不在,抱歉耽搁了。让我给你回电话。我也会给你一个csv。你的问题也是。这正是故事情节的全部。好吧,这里有一个例子。我也包括了一个小程序,这样你就可以有一个真实的例子来玩了。如果启动脚本,您将看到两个图形。图1是所请求的叠加年度数据,但却是可怕的xticks。图2是要求的xticks,但没有年度堆叠。这也符合打开/关闭原则: