我有一个熊猫数据框,如下所示:
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点。
我的输出将具有以下形式(我忽略了输出中的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
语句。
答案 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 |
+----+---------------------+------------+------------+------+