【问题标题】:using groupby on pandas dataframe to group by financial year在 pandas 数据框上使用 groupby 按财政年度分组
【发布时间】:2021-07-07 14:31:54
【问题描述】:

我有一个 dataframe 和一个名为 DT 的 datetime64 列。 4月1日到3月31日可以用groupby按财政年度分组吗?

例如,

    Date | PE_LOW 
    2010-04-01 | 15.44
    ...
    2011-03-31 | 16.8
    2011-04-02 | 17.
    ...
    2012-03-31 | 17.4

对于上述数据,我想按 2010-2011 财年和 2011-2012 财年分组,而不创建额外的列。*

【问题讨论】:

    标签: pandas group-by


    【解决方案1】:

    您要做的第一件事是定义一个将财政年度输出为值的函数。您可以使用以下内容。

    def getFiscalYear(dt):
        year = dt.year
        if dt.month<4: year -= 1
        return year
    

    您说您不想使用额外的列来对框架进行分组。通常通过说出类似 df.groupby("colname") 的内容来调用 groupby 方法,但该语句在语义上等同于 df.groupby(df["colname"] - 这意味着您可以执行类似的操作...

    grouped = DT.groupby(DT['Date'].apply(getFiscalYear))
    

    然后将方法应用于组或您想做的任何事情。如果您只想将这些组分开,请致电grouped.groups

    【讨论】:

      【解决方案2】:

      有了 pandas.DatetimeIndex,就很简单了:

      DT.groupby(pd.DatetimeIndex(DT.Date).shift(-3,freq='m').year)
      

      或者如果你使用Date作为DT的索引,那就更简单了:

      DT.groupby(DT.index.shift(-3,freq='m').year)
      

      但请注意,shift(-3,freq='m') 会将日期更改为月末;例如,4 月 8 日至 1 月 31 日等。无论如何,它很适合您的问题。

      【讨论】:

        【解决方案3】:

        我遇到了类似的问题,并使用 Grouper 并指定频率,使用以下方法将营业年度结束至 3 月(月 = 3):

        grouped_df = df.groupby([pd.Grouper(key='DateColumn', freq=pd.tseries.offsets.BYearEnd(month=3))])
        

        Pandas Business Year EndGrouper

        【讨论】:

          【解决方案4】:

          我为此找到的最简单的方法(类似于 Alex 的回答,但更简洁一些):

          df.groupby([pd.Grouper(key='DateColumn', freq="A-MAR")])
          

          如果您想在最后一个工作日完成年度,您可以使用freq="BA-MAR"

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-20
            • 2022-01-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多