根据自定义日长定义对连续周末进行分组
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 点。
我的输出将具有以下形式(我忽略了输出中的 HE
和 Date
列):
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 |
+----+---------------------+------------+------------+------+
我有一个 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 点。
我的输出将具有以下形式(我忽略了输出中的 HE
和 Date
列):
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 |
+----+---------------------+------------+------------+------+