Tarihlere Panda Verilerini Çerçeveleme


157

Bir 'tarih' sütun ile bir Panda DataFrame var. Şimdi DataFrame içinde önümüzdeki iki ay dışında tarihleri ​​olan tüm satırları filtrelemek gerekiyor. Esasen, sadece önümüzdeki iki ay içindeki satırları korumam gerekiyor.

Bunu başarmanın en iyi yolu nedir?

Yanıtlar:


238

Eğer tarih sütunu endeksidir , daha sonra pozisyonel endeksleme için etiket bazlı endeksleme veya .iloc için .loc kullanın.

Örneğin:

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

Ayrıntıları buradan görebilirsiniz http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

Sütun dizin değilse iki seçeneğiniz vardır:

  1. Dizini yapın (zaman serisi verileri geçici veya kalıcı olarak)
  2. df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]

Genel açıklama için buraya bakın

Not: .ix kullanımdan kaldırılmıştır.


4
Teşekkür ederim, okuyacağım. Tarih benim durumumda dizin değil, ayrı bir sütundur. Muhtemelen bu bilgileri en başta vermeliydim. Sorum çok bilgilendirici değildi.
AMM

42
queryBurada da kullanabilirsiniz . df.query('20130101 < date < 20130201').
Phillip Cloud

10
Örneklerinizdeki dizin ( .locve aracılığıyla .ix) ve sütun filtrelerinin eşdeğer olmadığını belirtmelisiniz. df.ix['2014-01-01':'2014-02-01']içerir 2014-02-01, df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]içermez 2013-02-01, yalnızca en fazla satır eşleşir 2013-01-31.
Rafael Barbosa

4
Bu çağrı şimdi kullanımdan kaldırıldı!
Mohamed Taher Alrefaie

6
Bir tarih aralığında, ancak birden çok tarihte filtre uygulamak istemezse ne olur?
Salem Ben Mabrouk

53

Önceki cevap deneyimime göre doğru değil, basit bir dize geçiremezsiniz, datetime nesnesi olması gerekir. Yani:

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

16
Kesinlikle hiçbir dize ile bir dize geçebilir.
Ninjakannon

9
ix dizin oluşturucusu kullanımdan kaldırıldı, loc - pandas.pydata.org/pandas-docs/stable/… adresini
Nick

3
pandalar herhangi bir "datetime" dizesini datetime nesnesine dönüştürür .. bu yüzden doğru
janscas

8
Bunu kullanarak aşağıdaki hatayı alıyorum: TypeError: 'int' ve 'datetime.date' örnekleri arasında '<' desteklenmiyor
Haris Khaliq

41

Tarihleriniz datetime paketini içe aktararak standartlaştırılmışsa şunları kullanabilirsiniz:

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

Tarih dizenizi datetime paketini standartlaştırmak için şu işlevi kullanabilirsiniz:

import datetime
datetime.datetime.strptime

5
Kullanılması tavsiye edilir df[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))].
So S

20

Datetime sütununuzda Pandas datetime türü (ör. datetime64[ns]) Varsa , uygun filtreleme için pd.Timestamp nesnesine ihtiyacınız vardır, örneğin:

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]


7

Bir sorgu ve yerel başvuru gerçekleştirmek için pd.Timestamp komutunu kullanabilirsiniz.

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")')

çıktı ile

                 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 için panda belgelerine , özellikle yerel değişken udsing @önekinden bahsedin . Bu durumda , zaman damgası dizesi sağlayabilmek için pd.Timestampyerel takma adı kullanmats


@Ts işlevleri için bir belge bağlantısı verebilir misiniz?
Glen Moutrie

6

Bu nedenle, csv veri dosyasını yüklerken, verilere bir tarih aralığına göre filtre uygulamak için tarih sütununu şimdi aşağıdaki gibi dizin olarak ayarlamamız gerekir. Artık kullanımdan kaldırılan yöntem için buna gerek yoktu: pd.DataFrame.from_csv ().

Verileri yalnızca Ocak ayından Şubat ayına kadar, örneğin 2020-01-01 ila 2020-02-29 arasında göstermek istiyorsanız, bunu yapabilirsiniz:

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'] 

Bu Python 3.7 için çalıştığı test edilmiştir. Umarım bunu faydalı bulursun.


1
index_colBir olmak zorunda stringbir liste değil. mydata = pd.read_csv('mydata.csv',index_col='date')
Sharl Sherif

5

Kullanmaya ne dersiniz? pyjanitor

Harika özelliklere sahiptir.

Sonra pip install pyjanitor

import janitor

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

2

Veri çerçevenizi tarihe göre filtrelemenin en kısa yolu: Tarih sütununuzun datetime64 türü olduğunu varsayalım [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

Henüz yorum yazma iznim yok, bu yüzden eğer birisi hepsini okuyacak ve buna ulaşacaksa, bir cevap yazacağım.

Veri kümesinin dizini bir tarihsa ve bunu yalnızca (örneğin) aylara göre filtrelemek istiyorsanız, aşağıdakileri yapabilirsiniz:

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

Bu, veri kümesini Mart ayına kadar filtreleyecektir.


1

Dizeyi zaten pd.to_datetime kullanarak bir tarih biçimine dönüştürdüyseniz şunu kullanabilirsiniz:

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.