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

时间:2019-04-22 15:45:37

标签: pandas python-3.5

我有一个熊猫数据框,如下所示:

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 AM和明天的10 AM之间。除非是周末,否则开始时间是星期六上午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语句。

1 个答案:

答案 0 :(得分:0)

这是我的多步骤方法

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