结合 pandas 数据透视表多索引标题 - 一个时间戳,一个字符串

Posted

技术标签:

【中文标题】结合 pandas 数据透视表多索引标题 - 一个时间戳,一个字符串【英文标题】:Combine pandas pivot table multi-index headers - one timestamp, one string 【发布时间】:2018-07-13 10:55:09 【问题描述】:

我有一个像这样的熊猫数据框:

    weatherdate publishdate weathernode value
384 2018-01-30  2018-01-30  CYWG    -11.67
385 2018-01-31  2018-01-30  CYWG    -15.56
432 2018-01-30  2018-01-30  CYYZ    -8.33
433 2018-01-31  2018-01-30  CYYZ    -5.00
512 2018-01-31  2018-01-31  CYWG    -17.22
560 2018-01-31  2018-01-31  CYYZ    -6.67

两个日期列都是 datetime64 格式。我将 df 转换为如下所示的数据透视表:

dffcst = pd.pivot_table(df, index='weatherdate', columns=['weathernode','publishdate'], values='value') 

然后得到这样的输出:

weathernode   CYWG                        CYYZ
publishdate   2018-01-30    2018-01-31  2018-01-30  2018-01-31
weatherdate             
2018-01-30    -11.67          NaN         -8.33       NaN
2018-01-31    -15.56         -17.22       -5.00      -6.67    

我想合并上面的两行列名,以获得类似下面的输出,我在 excel 中构建(注意下面的格式是最好的情况 - 删除年/月/日之间的破折号,否日期和机场代码之间的空格):

weatherdate CYWG20180130 CYWG20180131 CYYZ20180130 CYYZ20180131
1/30/2018   -11.67        NaN          -8.33        NaN
1/31/2018   -15.56        -17.22        -5          -6.67

我试着像这样加入他们:

dffcst.columns = [''.join(col) for col in dffcst.columns]

但我收到以下错误:

TypeError: sequence item 1: expected str instance, Timestamp found

因此,pandas 无法将第一行列名中的日期连接到第二行列名中的字符串。

我试过以下代码:

dffcst.columns = [''.join(str(col)) for col in dffcst.columns]

它可以工作,但是新的列标题对我来说有两个难以使用,所以我需要一个替代解决方案,就像我在上面的 Excel 中构建的那样。这是笨重的列标题的示例:

('CYWG', 时间戳('2018-01-30 00:00:00'))

我们的目标是将此表导出为 csv,该 csv 将被拉入 Excel 模型。我可以使用偏移匹配查找 excel 模型,这样我就可以在各种不同的预测日期查找各种气象站。也很高兴听到任何人对这个想法的想法。

【问题讨论】:

【参考方案1】:

使用strftime 将 Timestamp 对象转换为字符串:

dffcst.columns = [c[0] + pd.datetime.strftime(c[1], '%y%m%d') for c in dffcst.columns]

【讨论】:

谢谢彼得 - 这太棒了。不知道 strftime - 更多地研究它

以上是关于结合 pandas 数据透视表多索引标题 - 一个时间戳,一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

具有多索引的 Pandas 数据透视表小计

对多索引数据透视表 pandas 进行排序

pandas 透视多索引列

过滤多索引数据集(python/pandas)

pandas:如何使用多索引运行数据透视?

Pandas 从多索引级别获取所有值