【问题标题】:Convert pandas multi-index to pandas timestamp将 pandas 多索引转换为 pandas 时间戳
【发布时间】:2014-12-17 18:23:42
【问题描述】:

我正在尝试将 unstacked、multi-indexed 数据框转换回 single pandas 日期时间索引。

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

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

然后我应用多索引和unstacking,这样我就可以像这样将年度数据绘制在彼此之上:

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 

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

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 日期时间索引,仅使用月、日和小时数据,那么主要/次要刻度将按照我想要的方式自动绘制(我认为)。例如:

目前的解决方案:

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)

【问题讨论】:

  • 即使是一点提示也将不胜感激。
  • 我该如何提高这个以获得一些支持?这里有一些问题超过一年没有任何答案。
  • 再过一个月?任何事情都会有所帮助...
  • 您是否有理由要“自动”执行此操作?我可能只是编写一个函数来自定义生成 x-labels。这听起来比你想要的要快。
  • 感谢他的回复。也许你是对的,只是我需要在放大时保持合理的比例。我知道使用这种方法会解决这个问题。

标签: datetime pandas plot dataframe


【解决方案1】:

在这里回答:Pandas multi index to datetime。

df1_season.index = df1_season.index.to_frame()

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:
    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 是我测量中的数字数据点样本集。
    • 对,我想那时它是一个 x_axis 刻度操作......但我无法弄清楚如何做到这一点。您能否将数据加载到某个地方的 csv 以便我可以使用它并可能在此创建另一个帖子?最好的术语是“季节性图” - 从多年中获取信息并将它们绘制在一个 Jan-Dec 轴上?我找不到任何有关如何执行此操作的文档,这让我感到惊讶
    • 嘿!我已经离开了,抱歉耽搁了。让我在这件事上回复你。我也会给你一个csv。对你的问题也是。这正是情节的全部内容。
    • 好的,这是link to the source files。我也包含了一个小程序,这样你就可以有一个真实的例子来玩。如果启动脚本,您将看到两个数字。图 1 是所要求的堆积的年度数据,但可怕的 xticks。图 2 是请求的 xticks,但没有年度堆叠。
    猜你喜欢
    • 2019-11-20
    • 2017-07-11
    • 2018-10-09
    • 1970-01-01
    • 2021-12-17
    • 2018-10-30
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多