【问题标题】:Pandas Pivot with datetime index带有日期时间索引的 Pandas Pivot
【发布时间】:2018-06-12 23:07:07
【问题描述】:

我在以日期时间值作为索引的数据框旋转时遇到了一些麻烦。 我的 df 看起来像这样:

Timestamp           Value
2016-01-01 00:00:00 16.546900
2016-01-01 01:00:00 16.402375
2016-01-01 02:00:00 16.324250

其中时间戳为 a,datetime64[ns]。我正在尝试旋转表格,使其看起来像这样。


Hour       0    1    2    4   ....
Date
2016-01-01 16.5 16.4 16.3 17  ....
....
....

我尝试使用下面的代码,但运行时出现错误。

df3 =  pd.pivot_table(df2,index=np.unique(df2.index.date),columns=np.unique(df2.index.hour),values=df2.Temp)

KeyError                                  Traceback (most recent call last)
 in ()
      1 # Pivot Table
----> 2 df3 = pd.pivot_table(df2,index=np.unique(df2.index.date),columns=np.unique(df2.index.hour),values=df2.Temp)

~\Anaconda3\lib\site-packages\pandas\core\reshape\pivot.py in pivot_table(data, values, index, columns, aggfunc, fill_value, margins, dropna, margins_name) 56 for i in values: 57 if i not in data: ---> 58 raise KeyError(i) 59 60 to_filter = []

KeyError: 16.5469

任何帮助或见解将不胜感激。

【问题讨论】:

    标签: python pandas dataframe pivot-table


    【解决方案1】:

    我稍微扩展了如下输入数据(假设在同一日期/小时内没有重复条目)

    Timestamp           Value
    2016-01-01 00:00:00 16.546900
    2016-01-01 01:00:00 16.402375
    2016-01-01 02:00:00 16.324250
    2016-01-01 04:00:00 16.023928
    2016-01-03 04:00:00 16.101919
    2016-01-05 23:00:00 13.405928
    

    看起来有点别扭,但像下面这样有效。

    df2['Date'] = df2.Timestamp.apply(lambda x: str(x).split(" ")[0])
    df2['Hour'] = df2.Timestamp.apply(lambda x: str(x).split(" ")[1].split(":")[0])
    df3 = pd.pivot_table(df2, values='Value', index='Date', columns='Hour')
    

    [输出]

    Hour        00      01        02        04          23
    Date                    
    2016-01-01  16.5469 16.402375 16.32425  16.023928   NaN
    2016-01-03  NaN     NaN       NaN       16.101919   NaN
    2016-01-05  NaN     NaN       NaN       NaN         13.405928
    

    最后,如果你的列需要是整数,

    df3.columns = [int(x) for x in df3.columns]
    

    希望这会有所帮助。

    【讨论】:

    • 非常感谢!这成功了。我认为是 lambda 函数完成了大部分繁重的工作。小时不需要,但日期需要。
    【解决方案2】:

    不使用lambda 的另一种方法是从DateTimeIndex 创建索引。

    df2 = pd.pivot_table(df, index=df.index.date, columns=df.index.hour, values="Value")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2019-06-22
      • 2017-08-13
      • 1970-01-01
      • 2018-04-21
      • 2017-10-18
      • 2014-03-07
      相关资源
      最近更新 更多