根据日期添加类别列-Pandas Dataframe

时间:2018-09-18 00:46:15

标签: python pandas dataframe

我有一个带有ORDER_DATE列的数据框。我正在尝试为FISCAL_YEAR添加一个新列,该列实际上具有这种类型的条件:

  • 如果介于7/1/16和6/30/17之间= 2017财年
  • 如果介于7/1/17和6/30/18之间= 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'

2 个答案:

答案 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)