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?

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.


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

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

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]


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


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.


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)

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

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.


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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.