在Pandas数据框中使用groupby按财年分组

5

我有一个数据框,其中包含一个名为DT的datetime64列。是否可以使用groupby按财政年度(从4月1日到3月31日)进行分组?

例如:

    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进行分组,而不需要创建额外的列。
5个回答

4

首先,您需要定义一个输出财年的函数。您可以使用以下代码:

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

您说您不想使用额外的列来分组框架。通常,通过这样说来调用groupby方法:df.groupby("colname"),然而该语句在语义上等同于 df.groupby(df["colname"] - 意思是您可以像这样做...

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

然后对分组或其他你想要的对象应用方法。如果你只想要这些分组被分开,就调用 grouped.groups


3
使用 pandas.DatetimeIndex 很简单:
DT.groupby(pd.DatetimeIndex(DT.Date).shift(-3,freq='m').year)

如果您使用日期作为DT的索引,那么操作就更简单了:

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

但请注意,shift(-3,freq='m')将日期向月底推移;例如,4月8日会被推移至1月31日等。无论如何,这个函数非常适合你的问题。


1

我曾遇到类似问题,使用以下代码通过Grouper来指定频率并将财年结尾偏移至三月(month=3):

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

Pandas商务年末分组器


0
我发现最简单的方法是这样的(类似于Alex的答案,但稍微更加简洁):
df.groupby([pd.Grouper(key='DateColumn', freq="A-MAR")])

如果你想让年份以最后一个工作日结束,可以使用freq="BA-MAR"

0

类似于这个答案,但是我需要(在此初始帖子的时间)报告财政年度为2023年。这可以通过反转不等式并将递减变为递增来实现。

def fiscal_year(dt):
    year = dt.year
    if dt.month > 4:
        year += 1
    return year

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接