根据自定义日长定义对连续周末进行分组

Group consecutive weekend days based on custom day length definition

我有一个 pandas 数据框如下:

dateInfo[['HE', 'Date']].ix[1:4]
                     HE       Date
DateTime                          
2001-01-01 02:00:00   2 2001-01-01
2001-01-01 03:00:00   3 2001-01-01
2001-01-01 04:00:00   4 2001-01-01

Dates 范围从 2001 年到 2031 年。有没有办法创建一个列 StartDate,其中日期定义在今天上午 11 点到明天上午 10 点之间。除非是周末,开始时间是星期六上午 11 点,到星期二上午 10 点。

我的输出将具有以下形式(我忽略了输出中的 HEDate 列):

DateTime        StartDate
4/3/2019 11:00  4/3/2019
4/3/2019 12:00  4/3/2019
4/4/2019 7:00   4/3/2019
4/4/2019 10:00  4/3/2019
4/4/2019 11:00  4/4/2019
4/5/2019 10:00  4/4/2019
4/6/2019 11:00  4/6/2019
4/6/2019 12:00  4/6/2019
4/8/2019 23:00  4/6/2019
4/9/2019 9:00   4/6/2019
4/9/2019 10:00  4/6/2019
4/9/2019 11:00  4/9/2019

我完全不知道该怎么做,我觉得即使是 for loop 也会涉及很多 if then 语句。

这是我的多步骤方法

hours_shift = (df.DateTime.dt.hour <= 10)
df['date'] = pd.to_datetime(df.DateTime.dt.date)
df['day'] = df.date.dt.dayofweek

# shift Tuesdays
tues_shift = (df.day == 1) & hours_shift
df.loc[tues_shift, 'date'] -= pd.Timedelta(days=3)

# shift Mondays
mon_shift = (df.day==0)
df.loc[mon_shift, 'date'] -= pd.Timedelta(days=2)

# shift Sundays
sun_shift = (df.day==6)
df.loc[sun_shift, 'date'] -= pd.Timedelta(days=1)

# mark all the shifted
shifted = tues_shift | mon_shift | sun_shift

# shift the rest
hours_shift = hours_shift & ~shifted
df.loc[hours_shift, 'date'] -= pd.Timedelta(days=1)

df

输出(date 列):

+----+---------------------+------------+------------+------+
|    |      DateTime       | StartDate  |    date    |  day |
+----+---------------------+------------+------------+------+
|  0 | 2019-04-03 11:00:00 | 2019-04-03 | 2019-04-03 |    2 |
|  1 | 2019-04-03 12:00:00 | 2019-04-03 | 2019-04-03 |    2 |
|  2 | 2019-04-04 07:00:00 | 2019-04-03 | 2019-04-03 |    3 |
|  3 | 2019-04-04 10:00:00 | 2019-04-03 | 2019-04-03 |    3 |
|  4 | 2019-04-04 11:00:00 | 2019-04-04 | 2019-04-04 |    3 |
|  5 | 2019-04-05 10:00:00 | 2019-04-04 | 2019-04-04 |    4 |
|  6 | 2019-04-06 11:00:00 | 2019-04-06 | 2019-04-06 |    5 |
|  7 | 2019-04-06 12:00:00 | 2019-04-06 | 2019-04-06 |    5 |
|  8 | 2019-04-08 23:00:00 | 2019-04-06 | 2019-04-06 |    0 |
|  9 | 2019-04-09 09:00:00 | 2019-04-06 | 2019-04-06 |    1 |
| 10 | 2019-04-09 10:00:00 | 2019-04-06 | 2019-04-06 |    1 |
| 11 | 2019-04-09 11:00:00 | 2019-04-09 | 2019-04-09 |    1 |
+----+---------------------+------------+------------+------+