首页 > 解决方案 > 如何根据日期范围创建二进制变量

问题描述

我想将日期在特定假期前 1 周和后 1 周的所有行标记为 = 1;= 0 否则。

最好的方法是什么?下面是我的代码,它只将元旦标记为 new_year = 1。我想要的是所有 3 行都有 new_year = 1(因为它们在元旦前后的 1 周内)。

注意:我希望代码适用于任何假期(例如感恩节、复活节等)。

谢谢!

# importing pandas as pd
import pandas as pd
import holidays

# Creating the dataframe
df = pd.DataFrame({'Date': ['1/1/2019', '1/5/2019', '12/28/2018'],
                   'Event': ['Music', 'Poetry', 'Theatre'],
                   'Cost': [10000, 5000, 15000]})
df['newDate'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')

new_year = holidays.HolidayBase()

new_year.append({"2018-01-01": "New Year's Day",
                 "2019-01-01": "New Year's Day"})

df['hol_new_year'] = np.where(df['newDate'] in new_year, 1, 0)

标签: pythonpandasdataframedate

解决方案


您可以使用 pandas 的时间序列偏移量:

ye = pd.tseries.offsets.YearEnd()
yb = pd.tseries.offsets.YearBegin()
d = pd.to_timedelta('1w')
s = df['newDate']

df['hol_new_year'] = (s.between(s-ye-d, s-ye+d)
                     |s.between(s+yb-d, s+yb+d)
                      ).astype(int)

输出:

         Date    Event   Cost    newDate  hol_new_year
0    1/1/2019    Music  10000 2019-01-01             1
1    1/5/2019   Poetry   5000 2019-01-05             1
2  12/28/2018  Theatre  15000 2018-12-28             1
3   1/15/2021       SO      0 2021-01-15             0

推荐阅读