날짜 별 팬더 데이터 프레임 필터링


157

'날짜'열이있는 Pandas DataFrame이 있습니다. 이제 앞으로 2 개월이 지난 날짜가있는 DataFrame의 모든 행을 필터링해야합니다. 본질적으로 앞으로 2 개월 이내에있는 행만 유지하면됩니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까?

답변:


238

경우 날짜 열이 인덱스는 다음 위치 색인 레이블 기반 색인 또는 .iloc에 대한 .loc 사용합니다.

예를 들면 다음과 같습니다.

df.loc['2014-01-01':'2014-02-01']

자세한 내용은 여기를 참조하십시오 http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

열이 색인아닌 경우 두 가지 선택 사항이 있습니다.

  1. 시계열 데이터 인 경우 색인을 임시 또는 영구적으로 작성하십시오.
  2. df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]

일반적인 설명 은 여기 를 참조 하십시오

참고 : .ix는 더 이상 사용되지 않습니다.


4
고마워요 날짜는 별도의 열이며 내 경우에는 색인이 아닙니다. 아마도 그 정보를 처음에 제공했을 것입니다. 내 질문은 그다지 유익하지 않았습니다.
AMM

42
query여기에서도 사용할 수 있습니다 . df.query('20130101 < date < 20130201').
Phillip Cloud

10
예제의 인덱스 (via .loc.ix) 및 열에 대한 필터 는 동일하지 않습니다. df.ix['2014-01-01':'2014-02-01']포함 2014-02-01하지만 포함 df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]하지 않으면 2013-02-01최대 행까지만 일치합니다 2013-01-31.
라파엘 바르보사

4
이 통화는 더 이상 사용되지 않습니다!
Mohamed Taher Alrefaie

6
날짜 범위를 기준으로 필터링하지 않고 여러 날짜 시간을 기준으로 필터링하려면 어떻게해야합니까?
Salem Ben Mabrouk

53

이전 답변이 내 경험에 맞지 않습니다. 간단한 문자열을 전달할 수 없으며 datetime 객체 여야합니다. 그래서:

import datetime 
df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)]

16
문제없이 문자열을 절대 전달할 수 있습니다.
Ninjakannon

9
ix 인덱서는 더 이상 사용되지 않습니다. loc-pandas.pydata.org/pandas-docs/stable/…을
Nick

3
팬더는 "datetime"문자열을 날짜 / 시간 객체로 변환합니다. 그래서 그것은 정확합니다
janscas

8
이 오류를 사용하여 다음 오류가 나타납니다. TypeError : '<' 'int'인스턴스와 'datetime.date'인스턴스 사이에서 지원되지 않음
Haris Khaliq

41

datetime 패키지를 가져 와서 날짜가 표준화 된 경우 간단히 다음을 사용할 수 있습니다.

df[(df['date']>datetime.date(2016,1,1)) & (df['date']<datetime.date(2016,3,1))]  

datetime 패키지를 사용하여 날짜 문자열을 표준화하려면 다음 기능을 사용할 수 있습니다.

import datetime
datetime.datetime.strptime

5
을 사용하는 것이 좋습니다 df[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))].
그래서 S

20

날짜 시간 열에 Pandas 날짜 시간 유형 (예 :)datetime64[ns] 이있는 경우 적절한 필터링을 위해서는 pd.Timestamp 객체 가 필요합니다 . 예를 들면 다음과 같습니다.

from datetime import date

import pandas as pd

value_to_check = pd.Timestamp(date.today().year, 1, 1)
filter_mask = df['date_column'] < value_to_check
filtered_df = df[filter_mask]

14

날짜가 색인에 있으면 간단히 다음을 수행하십시오.

df['20160101':'20160301']

7

pd.Timestamp를 사용하여 쿼리 및 로컬 참조를 수행 할 수 있습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame()
ts = pd.Timestamp

df['date'] = np.array(np.arange(10) + datetime.now().timestamp(), dtype='M8[s]')

print(df)
print(df.query('date > @ts("20190515T071320")')

출력과 함께

                 date
0 2019-05-15 07:13:16
1 2019-05-15 07:13:17
2 2019-05-15 07:13:18
3 2019-05-15 07:13:19
4 2019-05-15 07:13:20
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25


                 date
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25

DataFrame.query 에 대한 팬더 문서 , 특히 로컬 변수 참조 udsing @접두사에 대한 언급을 살펴보십시오 . 이 경우 타임 스탬프 문자열을 제공 할 수 있도록 pd.Timestamp로컬 별칭 사용 을 참조 ts합니다.


@ts 함수에 대한 문서 링크를 전달할 수 있습니까?
Glen Moutrie

6

따라서 CSV 데이터 파일을로드 할 때 날짜 범위를 기준으로 데이터를 필터링하려면 날짜 열을 아래와 같이 색인으로 설정해야합니다. 더 이상 사용되지 않는 메소드 인 pd.DataFrame.from_csv ()에는 필요하지 않습니다.

1 월에서 2 월까지 (예 : 2020-01-01에서 2020-02-29) 2 개월 동안 데이터를 표시하려면 다음과 같이하십시오.

import pandas as pd
mydata = pd.read_csv('mydata.csv',index_col='date') # or its index number, e.g. index_col=[0]
mydata['2020-01-01':'2020-02-29'] # will pull all the columns
#if just need one column, e.g. Cost, can be done:
mydata['2020-01-01':'2020-02-29','Cost'] 

이것은 Python 3.7에서 작동하는 것으로 테스트되었습니다. 이 정보가 도움이 되길 바랍니다.


1
index_colstring목록 이 아니어야합니다. mydata = pd.read_csv('mydata.csv',index_col='date')
Sharl Sherif

5

사용은 어떻습니까 pyjanitor

멋진 기능이 있습니다.

pip install pyjanitor

import janitor

df_filtered = df.filter_date(your_date_column_name, start_date, end_date)

2

날짜별로 데이터 프레임을 필터링하는 가장 짧은 방법 : 날짜 열이 datetime64 [ns] 유형이라고 가정합니다.

# filter by single day
df = df[df['date'].dt.strftime('%Y-%m-%d') == '2014-01-01']

# filter by single month
df = df[df['date'].dt.strftime('%Y-%m') == '2014-01']

# filter by single year
df = df[df['date'].dt.strftime('%Y') == '2014']

1

아직 의견을 쓸 수 없으므로 누군가가 모든 의견을 읽고이 답변에 도달하면 답변을 드리겠습니다.

데이터 세트의 색인이 날짜 시간이고이를 (예를 들어) 개월 단위로 필터링하려는 경우 다음을 수행 할 수 있습니다.

df.loc[df.index.month = 3]

3 월까지 데이터 세트가 필터링됩니다.


1

pd.to_datetime을 사용하여 문자열을 날짜 형식으로 이미 변환 한 경우 다음을 사용할 수 있습니다.

df = df[(df['Date']> "2018-01-01") & (df['Date']< "2019-07-01")]


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.