使用掩码中的列表过滤掉数据框中的日期
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.date
, dt.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
编辑:这不是另一个问题的重复。这个问题是关于使用掩码从列表中过滤特定 日期 。另一个问题(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.date
, dt.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