잡동사니

반응형

질문

편집 : 이것은 다른 질문의 중복이 아닙니다. 이 질문은 마스크를 사용하여 목록에서 특정 날짜 를 필터링하는 것에 관한 것입니다. 다른 질문 (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)

답변1

배열을 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


 

 

 

 

출처 : https://stackoverflow.com/questions/63048482/using-a-list-in-a-mask-to-filter-out-dates-within-a-dataframe

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band