Memfilter DataFrames Pandas pada tanggal

157

Saya memiliki DataFrame Pandas dengan kolom 'tanggal'. Sekarang saya perlu memfilter semua baris dalam DataFrame yang memiliki tanggal di luar dua bulan ke depan. Intinya, saya hanya perlu mempertahankan baris yang ada dalam dua bulan ke depan.

Apa cara terbaik untuk mencapai ini?

AMM
sumber

Jawaban:

238

Jika kolom tanggal adalah indeks , maka gunakan .loc untuk pengindeksan berbasis label atau .iloc untuk pengindeksan posisi.

Sebagai contoh:

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

Lihat detail di sini http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

Jika kolom bukan indeks Anda memiliki dua pilihan:

  1. Buat indeks (baik sementara atau permanen jika itu adalah data time-series)
  2. df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]

Lihat sini untuk penjelasan umum

Catatan: .ix sudah usang.

Retozi
sumber
4
Terima kasih, akan membaca. Tanggal adalah kolom terpisah dan bukan indeks dalam kasus saya. Seharusnya aku memberikan informasi itu sejak awal. Pertanyaan saya tidak terlalu informatif.
AMM
42
Anda dapat menggunakannya di querysini juga. df.query('20130101 < date < 20130201').
Phillip Cloud
10
Anda harus menyebutkan bahwa filter untuk indeks (via .locdan .ix) dan kolom dalam contoh Anda tidak setara. df.ix['2014-01-01':'2014-02-01']termasuk 2014-02-01sementara df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]tidak termasuk 2013-02-01, itu hanya akan cocok dengan baris hingga 2013-01-31.
Rafael Barbosa
4
Panggilan ini sudah usang sekarang!
Mohamed Taher Alrefaie
6
Bagaimana jika seseorang tidak ingin memfilter pada rentang tanggal, tetapi pada beberapa data?
Salem Ben Mabrouk
53

Jawaban sebelumnya tidak benar dalam pengalaman saya, Anda tidak bisa memberikannya string sederhana, harus menjadi objek datetime. Begitu:

import datetime 
df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)]
oranye1
sumber
16
Saya benar-benar dapat melewatkan string tanpa masalah.
Ninjakannon
9
ix indexer sudah tidak digunakan lagi, gunakan loc - pandas.pydata.org/pandas-docs/stable/…
Nick
3
panda akan mengubah string "datetime" menjadi objek datetime .. jadi benar
janscas
8
Saya menerima kesalahan berikut menggunakan ini: TypeError: '<' tidak didukung antara contoh 'int' dan 'datetime.date'
Haris Khaliq
41

Dan jika tanggal Anda distandarisasi dengan mengimpor paket datetime, Anda cukup menggunakan:

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

Untuk menstandarkan string tanggal Anda menggunakan paket datetime, Anda dapat menggunakan fungsi ini:

import datetime
datetime.datetime.strptime
shm2008
sumber
5
Dianjurkan untuk digunakan df[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))].
Jadi S
20

Jika kolom datetime Anda memiliki tipe datetime Pandas (misalnya datetime64[ns]), untuk pemfilteran yang benar, Anda memerlukan objek pd.Timestamp , misalnya:

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]
VMAtm
sumber
14

Jika tanggal dalam indeks maka cukup:

df['20160101':'20160301']
fantabolous
sumber
7

Anda dapat menggunakan pd.Timestamp untuk melakukan kueri dan referensi lokal

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

dengan output

                 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

Lihat dokumentasi panda untuk DataFrame.query , khususnya penyebutan tentang @awalan udsing variabile yang dirujuk . Dalam hal ini kami referensi pd.Timestampmenggunakan alias lokal tsuntuk dapat menyediakan string timestamp

danielhrisca
sumber
Bisakah Anda melewati tautan untuk dokumentasi untuk fungsi @ts?
Glen Moutrie
6

Jadi ketika memuat file data csv, kita perlu mengatur kolom tanggal sebagai indeks sekarang seperti di bawah ini, untuk memfilter data berdasarkan rentang tanggal. Ini tidak diperlukan untuk metode yang sekarang sudah tidak digunakan lagi: pd.DataFrame.from_csv ().

Jika Anda hanya ingin menampilkan data selama dua bulan dari Januari hingga Februari, mis. 2020-01-01 hingga 2020-02-29, Anda dapat melakukannya:

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

Ini telah diuji bekerja untuk Python 3.7. Semoga Anda menemukan ini berguna.

Harry
sumber
1
index_colharus stringbukan daftar. mydata = pd.read_csv('mydata.csv',index_col='date')
Sharl Sherif
5

Bagaimana kalau menggunakan pyjanitor

Ini memiliki fitur keren.

Setelah pip install pyjanitor

import janitor

df_filtered = df.filter_date(your_date_column_name, start_date, end_date)
pakira79
sumber
2

Cara terpendek untuk memfilter dataframe Anda berdasarkan tanggal: Mari kita anggap kolom tanggal Anda adalah tipe 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']
Ekrem Gurdal
sumber
1

Saya belum diizinkan menulis komentar apa pun, jadi saya akan menulis jawaban, jika seseorang akan membaca semuanya dan mencapai yang ini.

Jika indeks dataset adalah datetime dan Anda ingin memfilter hanya dengan (misalnya) bulan, Anda dapat melakukan hal berikut:

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

Itu akan menyaring dataset untuk Anda pada bulan Maret.

uhetz
sumber
1

Jika Anda telah mengonversi string ke format tanggal menggunakan pd.to_datetime, Anda bisa menggunakan:

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

Jerin Mathew
sumber
0

Anda bisa memilih rentang waktu dengan melakukan: df.loc ['start_date': 'end_date']

Ernesto Lopez Fune
sumber