python - 如何根据日期范围创建二进制变量
问题描述
我想将日期在特定假期前 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)
解决方案
您可以使用 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
推荐阅读
- github-actions - 在 GitHub Action Error/Warning/Notice Messages 中指定参数有什么意义
- image-processing - 通过发布请求发送 .tif
- r - 来自父 UI 输入的模块服务器观察事件
- laravel - 使用 Laravel 基于商店时间表的订单取货系统
- c - C程序没有输出
- reactjs - 是否可以使用 reactjs 打开 chrome 扩展?
- redis - 有没有办法实现仅在密钥已经存在时才弹出的 BLPOPX?
- mysql - 在子查询之外使用子查询的结果
- regex - mod_rewrite 匹配编码的 URL
- sql - 如果 id 存在于另一个表中,则有条件地插入另一个表,否则插入到 oracle 中的两个表中