Группировать последовательные выходные дни на основе пользовательского определения длины дня - PullRequest
1 голос
/ 22 апреля 2019

У меня есть следующий пандас:

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:00 сегодня и 10:00 завтра. За исключением случаев, когда это выходные, когда начальный час - суббота 11:00 и вторник 10:00.

Мой вывод будет иметь следующую форму (я проигнорировал столбцы 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 заявлений, которые я чувствую.

1 Ответ

0 голосов
/ 22 апреля 2019

Вот мой многошаговый подход

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 |
+----+---------------------+------------+------------+------+
...