【问题标题】:Convert a DataFrame with Periods ("from" and "to" date columns) to a Series将带有句点(\"from\" 和 \"to\" 日期列)的 DataFrame 转换为 Series
【发布时间】:2022-10-19 20:26:23
【问题描述】:

我有一个带学校假期的 DataFrame。他们有一个“从”和“到”日期列。您能否为我提供一种简洁而简短的方法将其转换为每天的“is_holiday”系列?

我有:

idx From To Name
0 2017-12-25 2018-01-05 Xmas holiday
1 2018-02-12 2018-02-23 Sport holidy
2 2018-03-29 2018-04-02 Easter holiday

...

我想:

Date is_holiday
..
2017-12-24 False
2017-12-25 True
2017-12-26 True
..
2018-01-04 False
2018-01-05 True
..

等等..
...

为您提供方便的示例 DataFrame:

import pandas as pd
df = pd.DataFrame({
    "From": ["2017-12-25", "2018-02-12", "2018-03-29"],
    "To": ["2018-01-05","2018-02-23","2018-04-02"],
})
df.From = pd.to_datetime(df.From)
df.To = pd.to_datetime(df.To)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这个范围从最低的From 到最高的To,但您可以根据需要调整间隔:

    df = pd.DataFrame({"From": ["2017-12-25", "2018-02-12", "2018-03-29"],"To": ["2018-01-05","2018-02-23","2018-04-02"],
    })
    df.From = pd.to_datetime(df.From)
    df.To = pd.to_datetime(df.To)
    
    holidays = []
    for ix,row in df.iterrows():
        holidays += pd.date_range(row.From,row.To).tolist()
    
    all_dates = pd.DataFrame({'dates':pd.date_range(df.From.min(),df.To.max())})
    all_dates['is_holiday'] = False
    all_dates.loc[all_dates.dates.isin(holidays),'is_holiday'] = True
    

    编辑,更简洁的代码:

    holidays = []
    
    def holidays(x):
        return pd.date_range(x.From,x.To).tolist()
    
    holidays = df.apply(lambda x:holidays(x), axis=1).sum()
    all_dates = pd.DataFrame({'dates':pd.date_range(df.From.min(),df.To.max())})
    all_dates['is_holiday'] = False
    all_dates.loc[all_dates.dates.isin(holidays),'is_holiday'] = True
    

    【讨论】:

    • 非常感谢。我希望这将是一种“更清洁”的方式,而无需遍历行。但是,您的解决方案可以完成这项工作,而 pd.date_range 函数正是我想要的!
    • 我编辑了,也许现在更好了
    • 再次感谢你。这也是一种巧妙的方式
    【解决方案2】:

    这是我最后想出的最小的解决方案。它基于@imburningbabe 第一个解决方案.非常感谢您的灵感!如果没有你的回答,我将无法做到

    df = pd.DataFrame({"From": ["2017-12-25", "2018-02-12", "2018-03-29"],"To": ["2018-01-05","2018-02-23","2018-04-02"],
    })
    df.From = pd.to_datetime(df.From); df.To = pd.to_datetime(df.To)
    
    
    all_dates = pd.DataFrame(index=pd.date_range(df.From.min(),df.To.max()))
    all_dates['is_holiday'] = False
    
    for (from_, to) in df.itertuples(index=False):
        all_dates.loc[from_:to, 'is_holiday'] = True
    

    【讨论】:

      猜你喜欢
      • 2022-08-13
      • 2020-06-08
      • 2018-04-19
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多