Python 基于日期-数据框添加类别列

Python 基于日期-数据框添加类别列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个带有列ORDER\u DATE的数据框。我试图为财政年度添加一个新列,该列基本上具有以下标准: 如果2016年7月1日至2017年6月30日之间=2017财年 如果2017年7月1日至2018年6月30日之间=2018财年 我能想到的唯一方法是一系列条件语句,我确信这不是最有效或最优雅的。虽然我的解决方案能按预期的方式工作,但这需要很长时间,我希望能得到关于如何改进的建议 #adds a fiscal year column to purchases purchase

我有一个带有列ORDER\u DATE的数据框。我试图为财政年度添加一个新列,该列基本上具有以下标准:

  • 如果2016年7月1日至2017年6月30日之间=2017财年
  • 如果2017年7月1日至2018年6月30日之间=2018财年
我能想到的唯一方法是一系列条件语句,我确信这不是最有效或最优雅的。虽然我的解决方案能按预期的方式工作,但这需要很长时间,我希望能得到关于如何改进的建议

    #adds a fiscal year column to purchases
    purchases['FISCAL_YEAR'] = 'N/A'
    purchases['FISCAL_YEAR'][(purchases['ORDER_DATE'] >= dt.datetime.strptime('2017-07-01', "%Y-%m-%d").date()) & \
(purchases['ORDER_DATE'] <= dt.datetime.strptime('2018-06-30', "%Y-%m-%d").date())] = 'FY2017'

    purchases['FISCAL_YEAR'][(purchases['ORDER_DATE'] >= dt.datetime.strptime('2017-07-01', "%Y-%m-%d").date()) & \
(purchases['ORDER_DATE'] <= dt.datetime.strptime('2018-06-30', "%Y-%m-%d").date())] = 'FY2018'
#将会计年度列添加到采购中
采购[“会计年度”]=“不适用”
采购[‘会计年度’][(采购[‘订单日期’]>=dt.datetime.strtime('2017-07-01',%Y-%m-%d”).DATE()\
(采购['ORDER_DATE']=dt.datetime.strtime('2017-07-01',%Y-%m-%d”).DATE()和\
(采购['ORDER_DATE']
df['ORDER DATE']=pd.to_datetime(df['ORDER DATE']))
def财政年度(x):
如果(x>pd.to_datetime('2016-07-01'))和(xpd至日期时间('2017-07-01')和(x
您可以将
周期索引
分配给具有6月份年度频率(
a-Jun
)的数据帧,例如:

如果您需要字符串表示(如2015财年)


我对您调用的函数有点不熟悉。我不确定freq=D代表什么,也不理解“a-Jun”。您能详细说明一下吗?为了回答您的问题,我不一定需要字符串表示,但我需要具体的参数(例如,“会计年度”定义为7/1-6/30)freq
D
是每日的,因此它创建了从2015-01-01到2016-12-01(总共701个)的每日日期的数据框架。我这样做是为了创建一些日期的数据,我可以根据这些日期创建周期索引。参数
a-Jun
表示在6月底的年度频率,即7/1-6/30(如果使用
freq='A'
,则默认为
A-Dec
)。
df['ORDER DATE'] = pd.to_datetime(df['ORDER DATE'])
def fisc_year(x):
    if (x > pd.to_datetime('2016-07-01')) & (x < pd.to_datetime('2017-06-30')):
        return 'FY2017'
    elif (x > pd.to_datetime('2017-07-01')) & (x < pd.to_datetime('2018-06-30')):
        return 'FY2018'
df['FY'] = df['ORDER DATE'].apply(fisc_year)
df = pd.DataFrame({'date': pd.DatetimeIndex(start='2015-01', end='2016-12', freq='D')})
df = df.assign(fiscal_year=pd.PeriodIndex(df.date, freq='A-Jun'))
df.assign(fiscal_year_str='FY' + df['fiscal_year'].astype(str))