使用熊猫date_range标记会计年度不适用于最近日期

时间:2018-10-09 14:00:56

标签: python python-3.x pandas

我正在按会计年度分析交易,并使用一个具有日期时间列和年份单独列的数据框。我们的会计年度为xxxx的7月1日至xxxx的6月30日。以下代码适用于所有日期,但自2018年7月1日开始的任何日期除外,该日期属于2018-2019会计年度。标签不会为该日期生成任何东西。知道为什么吗?

y_min = min(data['year'].unique()) # 2008
y_max = max(data['year'].unique()) # 2018 
labels = [str(x) + ' - ' + str(x+1) for x in np.arange(y_min, y_max, 1)]
data['period'] = pd.cut(data.date, pd.date_range(str(y_min), str(y_max+1), freq='BAS-JUL'), right=False, labels=labels)

1 个答案:

答案 0 :(得分:1)

您没有提供足够的垃圾箱。尽管您的最大年份为2018,因为您应将日期与2019进行分组,但是您需要将最大年份增加1。类似地,您应从最小年份中减去1。

y_max = data.year.max() + 1
y_min = data.year.min() - 1

现在,您将拥有覆盖整个数据集的正确容器和标签:

pd.date_range(str(y_min), str(y_max+1), freq='BAS-JUL')
#DatetimeIndex(['2007-07-02', '2008-07-01', '2009-07-01', '2010-07-01', '2011-07-01',
#               '2012-07-02', '2013-07-01', '2014-07-01', '2015-07-01',
#               '2016-07-01', '2017-07-03', '2018-07-02', '2019-07-01'],
#              dtype='datetime64[ns]', freq='BAS-JUL')

labels = [str(x) + ' - ' + str(x+1) for x in np.arange(y_min, y_max, 1)]
#['2007 - 2008',
# '2008 - 2009',
# '2009 - 2010',
#...
# '2017 - 2018',
# '2018 - 2019']