【问题标题】:Split date index to yearly index and monthly columns将日期索引拆分为年度索引和月度列
【发布时间】:2021-10-21 03:52:04
【问题描述】:

我有一个这样的数据框:

data_date   value
2016-01-01  1
2016-01-02  2
2017-02-05  3
2017-02-07  4
2017-03-09  5

我需要将其转换为以年为索引、以月为列的表。 (使用 sum 聚合)

最终的输出应该是这样的

      Jan | Feb | Mar | Apr | ........... Dec |
2016  3   | xx  | xx  | xx  | ............    |
2017  xx  | 7   | 5   | xx  | ............    |

这就是我所做的:

为了便于复制:

import pandas as pd
df=pd.DataFrame([
 {'data_date': '2016-01-01', 'value': 1},
 {'data_date': '2016-01-02', 'value': 2},
 {'data_date': '2017-02-05', 'value': 3},
 {'data_date': '2017-02-07', 'value': 4},
 {'data_date': '2017-03-09', 'value': 5}])

我使用 TimeGrouper 首先将它聚合到每月,如下所示:

df['data_date'] = pd.to_datetime(df['data_date'])
df.set_index('data_date', inplace=True)
grp_df = df.groupby([pd.Grouper(freq='M')]).sum()

所以现在我将数据汇总到每一行,以月/年为单位。 我不知道如何将月份设为列,将年份设为行。

你能帮帮我吗?

【问题讨论】:

    标签: python pandas datetimeindex


    【解决方案1】:

    试试 pivot_table:

    (df.assign(year=df.data_date.dt.year, month=df.data_date.dt.strftime('%b'))
       .pivot_table(index='year', columns='month', values='value', aggfunc='sum')
       .reindex(['Jan','Feb','Mar','Dec'], axis=1)   # change this to correct month names
    )
    

    或者pd.crosstab:

    pd.crosstab(
        index=df.data_date.dt.year,
        columns=df.data_date.dt.strftime('%b'),
        values=df['value'],
        aggfunc='sum'
    ).reindex(['Jan','Feb','Mar','Dec'], axis=1)
    

    输出:

    month  Jan  Feb  Mar  Dec
    year                     
    2016   3.0  NaN  NaN  NaN
    2017   NaN  7.0  5.0  NaN
    

    【讨论】:

      【解决方案2】:

      你可以使用:

      df['data_date'] = pd.to_datetime(df['data_date'])
      df['year'] = df['data_date'].dt.year
      df['month'] = df['data_date'].dt.month_name().str[:3]
      df = df.pivot_table(index='year', columns='month', values='value', aggfunc='sum')
      

      【讨论】:

      • 感谢您的回复!你的方法是正确的,但答案不匹配,因为 pivot_table 默认聚合是mean,但我需要sum
      • 抱歉,我错过了那部分,现在编辑
      【解决方案3】:

      如果您需要一年中的所有月份,resample 的解决方案可能会有所帮助。如果您不需要它,那么这样做是没有意义的:

      df['data_date'] = pd.to_datetime(df['data_date'])
      grp = df.set_index('data_date')
      grp = grp.resample('M').sum().reset_index()
      grp = grp.assign(year = grp.data_date.dt.year, 
                       month = grp.data_date.dt.month_name().str[:3])
      grp['month'] = grp['month'].astype(pd.CategoricalDtype(grp.month.unique(),
                                                             ordered=True))
      grp.pivot('year', 'month', 'value')
      
      month  Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
      year
      2016   3.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
      2017   0.0  7.0  5.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
      

      【讨论】:

        猜你喜欢
        • 2021-10-11
        • 1970-01-01
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 2019-05-22
        • 2016-02-20
        • 1970-01-01
        • 2017-08-27
        相关资源
        最近更新 更多