Python从datetime数据帧获取策略年

2024-06-07 03:53:02 发布

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

我有一个数据帧(df),其中一列的日期时间格式为YYYY-MM-DD(“日期”)。我正在尝试创建一个新列,返回始终从4月1日开始的政策年,因此1月至3月的政策年将始终是前一个日历年。有些日期比较旧,因此为下面的样本量设置单独的日期范围并不理想

数据帧看起来像这样

df['date']

    2020-12-10
    2021-02-10 
    2019-03-31

输出应该是这样的

2020 
2020 
2018

我现在知道了如何使用df['date'].dt.year获得年份。但是,我很难让数据帧将每年转换为相应的策略年,以便if df['date'].dt.month >= 4然后df['date'].dt.yearelse df['date'].dt.year - 1

我不太清楚如何准确地设置它。我一直在努力避免设置多个列来完成一个月的bool>;=4然后设置不同的列。我已经设置好了,但是得到了ValueError,表示这个系列太模糊了

def PolYear(x):
  y = x.dt.month
  if y >= 4:
    x.dt.year
  else:
    x.dt.year - 1

df['Pol_Year'] = PolYear(df['date'])

我不确定这是否是正确的方法,因此我还尝试了>;=df.loc格式及<;4但len键和值不相等。我肯定觉得我错过了一些非常简单的东西

我之前提到过“财政年度”,但这是不正确的


Tags: 数据gtdfdateif格式时间dt
2条回答

这是qyear

df.date.dt.to_period('Q').dt.qyear

输出:

0    2020
1    2021
2    2019
Name: date, dtype: int64

Quang Hoand的想法是正确的,但在调用to_period(self, freq)时使用了错误的频率。出于您的目的,您希望使用以下代码:

df.date.dt.to_period('Q-MAR').dt.qyear

这将为您提供:

0    2021
1    2021
2    2019
Name: date, dtype: int64

Q-MAR在三月份定义财政年度结束

这些值是正确的会计年度(会计年度使用它们结束的年份,而不是开始的年份[reference])。如果您想使用它们开始的年份获得输出,很简单:

df.date.dt.to_period('Q-MAR').dt.qyear - 1

给你

0    2020
1    2020
2    2018
Name: date, dtype: int64

qyear docs

相关问题 更多 >