使用掩码中的列表过滤掉数据框中的日期

Using a list in a mask to filter out dates within a dataframe

编辑:这不是另一个问题的重复。这个问题是关于使用掩码从列表中过滤特定 日期 。另一个问题(How to filter Pandas dataframe using 'in' and 'not in' like in SQL)使用完全不同的方法 df.column.isin()。此外,另一个问题使用分类字符串对象数据而不是日期时间数据来过滤。

这是我对 .isin() 的尝试:

list_dates = [np.datetime64('2018-12-31'),np.datetime64('2019-01-01')]
df[~df['StartTime'].dt.date.isin(list_dates)]

输出:

    StartTime   Duration    Site
0   2018-12-30 01:45:00 1   1
1   2018-12-31 05:48:00 1   2
2   2018-12-31 17:36:00 3   3

这个输出显然不正确,因为在列表中,我指定要过滤掉“2018-12-31”。


我一直在学习如何使用掩码过滤掉数据框中的日期。

首先,这是我正在测试的数据框:

data = {'StartTime':['2018-12-30 12:45:00+11:00','2018-12-31 16:48:00+11:00','2019-01-01 04:36:00+11:00','2019-01-01 19:27:00+11:00','2019-01-02 05:13:00+11:00'],
        'Duration':[1,1,3,1,2],
        'Site':['1','2','3','4','5']    
}

df = pd.DataFrame(data)
df['StartTime'] = pd.to_datetime(df['StartTime'])

接下来,我要筛选出一个日期。这有效:

mask = (df['StartTime'].dt.date != np.datetime64('2019-01-01'))

df.loc[mask]

但是,我想为多个日期执行此操作,为多个日期写同一行会很痛苦。本质上,我想过滤掉日期列表。例如,我想过滤掉所有 public 个假期。

我可以做这样的事情吗?

list_of_holiday_dates = [np.datetime64('2019-01-01'), np.datetime64('2019-12-25')]

mask = (df['StartTime'] != list_of_holiday_dates)

df.loc[mask]

原因是,该列表需要定期更新,因为 public 假期的日期因年份而异。


出于好奇,只是第二个问题;为什么你制作面具时使用 dt.datedt.hour

mask = (df['StartTime'].dt.date != np.datetime64('2019-01-01'))

但是当你直接 select/index 它时,你不能使用 .dt

# this works
df.iloc[0].StartTime.date
# this works
df.iloc[0].StartTime.dt.date()
# this doesn't work, but is used in the mask
df.iloc[0].StartTime.dt.date

# this works
df.iloc[0].StartTime.hour
# this doesn't work, but would be used in the mask
df.StartTime.dt.hour.between(6,9)

通过将数组转换为 DatetimeIndex 然后通过 DatetimeIndex.date:

将值转换为日期
list_dates = [np.datetime64('2018-12-31'),np.datetime64('2019-01-01')]


df = df[~df['StartTime'].dt.date.isin(pd.DatetimeIndex(list_dates).date)]
print (df)
            StartTime  Duration  Site
0 2018-12-30 01:45:00         1     1