편집 : 이것은 다른 질문의 중복이 아닙니다. 이 질문은 마스크를 사용하여 목록에서 특정 날짜 를 필터링하는 것에 관한 것입니다. 다른 질문 (SQL에서와 같이 'in'및 'not in'을 사용하여 Pandas 데이터 프레임을 필터링하는 방법)은 완전히 다른 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]
그러나 여러 날짜에 대해이 작업을 수행하고 싶습니다. 여러 날짜에 대해 동일한 줄을 작성하는 것이 고통 스러울 것입니다. 기본적으로 날짜 목록을 필터링하고 싶습니다. 예를 들어 모든 공휴일을 필터링하고 싶습니다.
이런 식으로 할 수 있습니까?
list_of_holiday_dates = [np.datetime64('2019-01-01'), np.datetime64('2019-12-25')]
mask = (df['StartTime'] != list_of_holiday_dates)
df.loc[mask]
그 이유는 공휴일이 연도에 따라 다르기 때문에 목록이 정기적으로 업데이트되어야하기 때문입니다.
호기심을위한 두 번째 질문입니다. 마스크를 만들 때 dt.date
, dt.hour
등을 사용하는 이유는 무엇입니까?
mask = (df['StartTime'].dt.date != np.datetime64('2019-01-01'))
그러나 직접 선택 / 인덱싱 할 때는 .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)