如何在布尔索引后删除列中的某些值



我有一个df,如下所示:

dates   values
2020-03-29 00:30:00 86.824
2020-03-29 00:45:00 86.923
2020-03-29 01:00:00 87.222
2020-03-29 01:15:00 87.52
2020-03-29 01:30:00 87.918
2020-03-29 01:45:00 88.415
2020-03-29 02:00:00 89.012
2020-03-29 02:15:00 89.807
2020-03-29 02:30:00 90.504
2020-03-29 02:45:00 90.702
2020-03-29 03:00:00 90.205
2020-03-29 03:15:00 88.713
2020-03-29 03:30:00 86.724
2020-03-29 03:45:00 84.636
2020-03-29 04:00:00 83.044
2020-03-29 04:15:00 82.249

我正在考虑夏令时,为此,我必须只删除dates列中的日期,而不应删除values列中的值。

由于每年的夏令时都是在三月的最后一个星期日,我做了以下操作来获取三月最后一个周日的日期:

import datetime
currentYear = datetime.datetime.now().strftime("%Y")
march_last_day = currentYear + '-03-31'
march_last_day = datetime.datetime.strptime(march_last_day, '%Y-%m-%d')
ZEIT_UMSTELLUNG_START = march_last_day - 
datetime.timedelta((march_last_day.weekday() + 1) % 7)
ZEIT_UMSTELLUNG_START = ZEIT_UMSTELLUNG_START.replace(hour=2, minute=00)
ZEIT_UMSTELLUNG_START_2 = ZEIT_UMSTELLUNG_START + datetime.timedelta(hours=1)

值:

ZEIT_UMSTELLUNG_START.replace(hour=2, minute=00)
Out[13]: datetime.datetime(2020, 3, 29, 2, 0)
ZEIT_UMSTELLUNG_START + datetime.timedelta(hours=1)
Out[14]: datetime.datetime(2020, 3, 29, 3, 0)

现在,我想从dates列中删除位于ZEIT_UMSTELLUNG_START(包含(和ZEIT_UMSTELLUNG_START_2(排除(之间的dates,下一个值应该"上移",但values列中的值不应该受到干扰。

我做到了:

mask = (df['dates'] >= ZEIT_UMSTELLUNG_START) & (df['dates'] < ZEIT_UMSTELLUNG_START_2)
df = df.loc[mask]

但它同时删除了这两列。

所需输出

dates   values
2020-03-29 00:30:00 86.824
2020-03-29 00:45:00 86.923
2020-03-29 01:00:00 87.222
2020-03-29 01:15:00 87.52
2020-03-29 01:30:00 87.918
2020-03-29 01:45:00 88.415
2020-03-29 03:00:00 89.012
2020-03-29 03:15:00 89.807
2020-03-29 03:30:00 90.504
2020-03-29 03:45:00 90.702
2020-03-29 04:00:00 90.205
2020-03-29 04:15:00 88.713
NaT        86.724
NaT        84.636
NaT        83.044
NaT        82.249

如果将我的所需输出与原始df进行比较,您可以看到02:00:0003:00:00之间的时间戳已被删除,而其他列只是被推送或上移。移位后,dates列最后4行的NaN可以放置

尝试

df.loc[mask, 'dates'] = pd.NaT
df['dates'] = df['dates'].sort_values(ascending=True).tolist()

最新更新