使用基于日期范围的分类变量创建新列



如果我有这样的数据,让我们一年的时间序列日期(2019( -

datetime
0   15.02.19 13:00
1   15.02.19 14:00
2   15.02.19 15:00
3   15.02.19 16:00
4   15.02.19 17:00

我想创建一个新列,如果我的日期时间在某个范围内(学校假期日期从 2019 年开始(和"学期时间",则具有"学校假期"值,否则我将如何以最有效的方式处理这个问题?生成的数据帧应如下所示-

datetime    school holiday
0   15.02.19 13:00  Term time
1   15.02.19 14:00  Term time
2   15.02.19 15:00  Term time
3   15.02.19 16:00  Term time
4   15.02.19 17:00  School Holiday

我的想法是,我会把学校放假的日期定为这样的:

Autumn Half Term Holidays   21 Oct 2019 - 25 Oct 2019
Winter Holidays             23 Dec 2019 - 3 Jan 2020
etc...

并用这些日期制作字典,然后以某种方式使用 lamba 应用?本质上,该函数应该是 - 如果日期时间 == holiday_range:"学校假期",否则:"学期时间"。

感谢您的帮助

也许这会有所帮助:

holidays = {'Autumn Half Term Holidays': ('16 Feb 2019', '25 Feb 2019')}
holidays_map = {date.date(): holiday for holiday, dates in holidays.items() for date in pd.date_range(*dates)}
df['holiday'] = df['datetime'].dt.date.map(holidays_map).fillna('Term time')
df
datetime                    holiday
0 2019-02-15 13:00:00                  Term time
1 2019-02-15 14:00:00                  Term time
2 2019-02-15 15:00:00                  Term time
3 2019-02-15 16:00:00                  Term time
4 2019-02-16 17:00:00  Autumn Half Term Holidays

数据帧中的行数可能多于唯一假日。对于这样的问题,您可能需要在某个地方循环,因此最好循环较少的假期

将您的日期转换为datetimedtype,让我们将假期存储在单独的数据帧中,同样使用datetimedtype

import pandas as pd
df['datetime'] = pd.to_datetime(df['datetime'], format='%d.%m.%y %H:%M')
df2 = pd.DataFrame({'Holiday': ['Autumn Half Term Holidays', 'Winter Holidays'],
'start': pd.to_datetime(['2019-10-21', '2019-12-23']),
'end': pd.to_datetime(['2019-10-25', '2020-01-03'])})

现在,为了确定某件事是否是假期,我们检查日期时间是否在任何时间段之间。地图只会获取您的标注,而不是真/假。鉴于您的假期,我在您的示例中添加了一行,只是为了说明它有效。

df['holiday'] = (pd.concat([df['datetime'].between(start, end) for start,end in zip(df2.start, df2.end)], 1)
.any(1)
.map({True: 'School Holiday', False: 'Term time'}))
datetime         holiday
0 2020-01-01 01:00:00  School Holiday
1 2019-02-15 13:00:00       Term time
2 2019-02-15 14:00:00       Term time
3 2019-02-15 15:00:00       Term time
4 2019-02-15 16:00:00       Term time
5 2019-02-15 17:00:00       Term time

最新更新