【问题标题】:How to create a binary variable based on date ranges如何根据日期范围创建二进制变量
【发布时间】:2021-11-08 21:47:28
【问题描述】:

我想将日期在特定假期前 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)

【问题讨论】:

    标签: python pandas dataframe date


    【解决方案1】:

    您可以使用 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
    

    【讨论】:

    • 嗨!我需要编写代码才能在任何假期工作,而不仅仅是元旦。我已经编辑了我的原始帖子。你能帮忙吗?谢谢!
    • 这是相同的机制,只是使用不同的参考点。如果假期在一年中是固定的,您甚至可以删除年份以使其更容易。我让你自己试一试,因为我在手机上,打字不是最好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2019-04-15
    相关资源
    最近更新 更多