Python 确定熊猫的年度营业年度

Python 确定熊猫的年度营业年度,python,pandas,data-science,pandas-datareader,Python,Pandas,Data Science,Pandas Datareader,我有一个包含月份和年份的数据框: df: month year 0 Jan 2012.0 1 Feb 2012.0 2 Mar 2012.0 3 Apr 2012.0 4 May 2012.0 5 Jun 2012.0 6 Jul 2012.0 7 Aug 2012.0 8 Sep 2012.0 9 Oct 2012.0 10 Nov 2012.0 11

我有一个包含月份和年份的数据框:

df:
    month   year
0   Jan     2012.0
1   Feb     2012.0
2   Mar     2012.0
3   Apr     2012.0
4   May     2012.0
5   Jun     2012.0
6   Jul     2012.0
7   Aug     2012.0
8   Sep     2012.0
9   Oct     2012.0
10  Nov     2012.0
11  Dec     2012.0
我想添加另一个列,确定从每年的3月开始的业务年度,如下所示:

df:
        month   year     business_year
    0   Jan     2012.0     2011
    1   Feb     2012.0     2011
    2   Mar     2012.0     2012
    3   Apr     2012.0     2012
    4   May     2012.0     2012
    5   Jun     2012.0     2012
    6   Jul     2012.0     2012
    7   Aug     2012.0     2012
    8   Sep     2012.0     2012
    9   Oct     2012.0     2012
    10  Nov     2012.0     2012
    11  Dec     2012.0     2012
    12  Jan     2013.0     2012
    13  Feb     2013.0     2012
IIUC,使用pd.to_datetime转换为datetime。然后,您可以从每个日期减去2个月,并返回结果的相应年份

import calendar

mapping = {calendar.month_abbr[i]: i for i in range(13)}
df['month'] = df['month'].map(mapping)

(pd.to_datetime(df.assign(day=1)) - pd.offsets.MonthBegin(2)).dt.year

0     2011
1     2011
2     2012
3     2012
4     2012
5     2012
6     2012
7     2012
8     2012
9     2012
10    2012
11    2012
dtype: int64
IIUC,使用pd.to_datetime转换为datetime。然后,您可以从每个日期减去2个月,并返回结果的相应年份

import calendar

mapping = {calendar.month_abbr[i]: i for i in range(13)}
df['month'] = df['month'].map(mapping)

(pd.to_datetime(df.assign(day=1)) - pd.offsets.MonthBegin(2)).dt.year

0     2011
1     2011
2     2012
3     2012
4     2012
5     2012
6     2012
7     2012
8     2012
9     2012
10    2012
11    2012
dtype: int64

假设您的月份是字符串,则可以使用以下代码段:

df['business_year'] = df['year'] + df['month'].apply(lambda x: -1 if x in ('Jan', 'Feb') else 0)
或者,如果您想要更高性能的产品:

df['business_year'] = df['year'] + ~df1['month'].isin(('Jan', 'Feb')) - 1

假设您的月份是字符串,则可以使用以下代码段:

df['business_year'] = df['year'] + df['month'].apply(lambda x: -1 if x in ('Jan', 'Feb') else 0)
或者,如果您想要更高性能的产品:

df['business_year'] = df['year'] + ~df1['month'].isin(('Jan', 'Feb')) - 1

为什么月份拼写为monath?df['business_year']=df['year']+df['monath']。applylambda x:-1如果“一月”、“二月”中的x为0,则假设第一列为string@Mstaino很好,谢谢。我有一个问题,关于这种警告再次发生,每次这样的专栏电话发生在熊猫。试图在数据帧切片的副本上设置一个值。你知道如何解决这个问题吗?@debuggingXD谢谢你,伙计,它起作用了,也许。。。但是为了回答你的另一个问题,如果你喜欢阅读,我有一个可以帮助你的方法。@debuggingXD-strange,这个警告是因为你将公式应用到数据帧的某个奇怪部分而引起的。还请注意,我给了您一个非常简单的解决方案,但不是@coldspeed指出的最快的解决方案,也就是说,如果您有一个大的df并且想要性能的话。我发布了一个包含和不包含apply的解决方案,所以您有两个示例。为什么月份拼写为monath?df['business_year']=df['year']+df['monath']。applylambda x:-1如果“一月”、“二月”中的x为0,则假设第一列为astring@Mstaino很好,谢谢。我有一个问题,关于这种警告再次发生,每次这样的专栏电话发生在熊猫。试图在数据帧切片的副本上设置一个值。你知道如何解决这个问题吗?@debuggingXD谢谢你,伙计,它起作用了,也许。。。但是为了回答你的另一个问题,如果你喜欢阅读,我有一个可以帮助你的方法。@debuggingXD-strange,这个警告是因为你将公式应用到数据帧的某个奇怪部分而引起的。还请注意,我给了您一个非常简单的解决方案,但不是@coldspeed指出的最快的解决方案,也就是说,如果您有一个大的df并且想要性能的话。我发布了一个包含和不包含apply的解决方案,所以您有两个示例。您应该将第一个解决方案全部删除,因为您的第二个解决方案是纯矢量化的,根本不需要使用datetime。回答得好。你应该把第一个解决方案全部删掉,因为你的第二个解决方案是纯矢量化的,根本不需要使用日期时间。回答得好。