我有一个带有ORDER_DATE列的数据框。我正在尝试为FISCAL_YEAR添加一个新列,该列实际上具有这种类型的条件:
我可以想到的唯一方法是一系列条件语句,我确信这不是最有效或最优雅的方法。虽然我的解决方案可以按预期工作,但它需要花费很多时间,我希望就如何使其更好地提出建议。
#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'
答案 0 :(得分:1)
您可以将PeriodIndex
分配给每年六月的频率(A-Jun
),例如:
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'))
如果您需要字符串表示形式(例如2015财年),
df.assign(fiscal_year_str='FY' + df['fiscal_year'].astype(str))
答案 1 :(得分:0)
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)