按每个期间的列重新组织定时日期

2024-09-27 23:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的数据集,是关于太阳能电池板在多年中每十分钟的产量。我想得到一个条形图,显示这些日志每年每月的总和

我不知道这是否有意义,所以让我用一个例子来解释

通过重新采样,我得到了以下数据帧:

Last updated
2017-01-31 00:00:00+01:00     24.1
2017-02-28 00:00:00+01:00     44.8
2017-03-31 00:00:00+02:00    140.1
2017-04-30 00:00:00+02:00    168.7
2017-05-31 00:00:00+02:00    194.4
2017-06-30 00:00:00+02:00    214.7
2017-07-31 00:00:00+02:00    204.6
2017-08-31 00:00:00+02:00    159.5
2017-09-30 00:00:00+02:00    117.3
2017-10-31 00:00:00+01:00     74.8
2017-11-30 00:00:00+01:00     30.4
2017-12-31 00:00:00+01:00      7.2
2018-01-31 00:00:00+01:00      9.4
Freq: M, Name: Yield (kWh), dtype: float64

我认为实现我想要的情节最好的方法是把它转换成一个数据帧

  • 一个只包含月份的索引(DateTimeIndex可以这样做吗,或者我应该简单地使用从1到12的RangeIndex吗?)
  • 每年一列(本例中为2016年和2017年)
  • 价值观也相应重组

例如:

Last updated   2017  2018
Jan            24.1   9.4
Feb            44.8     0
Mar           140.1     0
Apr           168.7     0
May           194.4     0
Jun           214.7     0
Jul           204.6     0
Aug           159.5     0
Sep           117.3     0
Oct            74.8     0
Nov            30.4     0
Dec             7.2     0

我可以很容易地通过一些天真的循环来实现这一点,但我相信熊猫一定会对我隐藏一些聪明的把戏。有人能给我指出一个有效的解决办法吗

非常感谢


Tags: 数据name例子kwh意义last条形图产量
1条回答
网友
1楼 · 发布于 2024-09-27 23:25:27

您可以使用^{}

df = pd.pivot(index=df.index.strftime('%b'), 
              columns=df.index.year, 
              values=df['Last updated']).fillna(0).reindex(cats)
print (df)
      2017  2018
Jan   24.1   9.4
Feb   44.8   0.0
Mar  140.1   0.0
Apr  168.7   0.0
May  194.4   0.0
Jun  214.7   0.0
Jul  204.6   0.0
Aug  159.5   0.0
Sep  117.3   0.0
Oct   74.8   0.0
Nov   30.4   0.0
Dec    7.2   0.0

另一个更一般的解决方案是,如果需要,将Last updated中的值与^{}^{}^{}生成的月份进行聚合,然后聚合sum(或者mean,如果需要),按^{}重新整形,最后^{}

df = (df.groupby([df.index.strftime('%b'), df.index.year])['Last updated']
        .sum().unstack(fill_value=0)
        .reindex(cats))
print (df)
      2017  2018
Jan   24.1   9.4
Feb   44.8   0.0
Mar  140.1   0.0
Apr  168.7   0.0
May  194.4   0.0
Jun  214.7   0.0
Jul  204.6   0.0
Aug  159.5   0.0
Sep  117.3   0.0
Oct   74.8   0.0
Nov   30.4   0.0
Dec    7.2   0.0

ordered categoricals解决正确排序问题:

cats = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
cat_type = pd.api.types.CategoricalDtype(categories=cats, ordered=True)
c = pd.Categorical(df.index.strftime('%b'), dtype=cat_type)

df = (df.groupby([c, df.index.year])['Last updated']
        .sum().unstack(fill_value=0))
print (df)
      2017  2018
Jan   24.1   9.4
Feb   44.8   0.0
Mar  140.1   0.0
Apr  168.7   0.0
May  194.4   0.0
Jun  214.7   0.0
Jul  204.6   0.0
Aug  159.5   0.0
Sep  117.3   0.0
Oct   74.8   0.0
Nov   30.4   0.0
Dec    7.2   0.0

相关问题 更多 >

    热门问题