Jawaban:
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:
df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]
Lihat sini untuk penjelasan umum
Catatan: .ix sudah usang.
query
sini juga. df.query('20130101 < date < 20130201')
.
.loc
dan .ix
) dan kolom dalam contoh Anda tidak setara. df.ix['2014-01-01':'2014-02-01']
termasuk 2014-02-01
sementara 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
.
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)]
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
df[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))]
.
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]
Jika tanggal dalam indeks maka cukup:
df['20160101':'20160301']
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.Timestamp
menggunakan alias lokal ts
untuk dapat menyediakan string timestamp
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.
index_col
harus string
bukan daftar. mydata = pd.read_csv('mydata.csv',index_col='date')
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']
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.
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")]
Anda bisa memilih rentang waktu dengan melakukan: df.loc ['start_date': 'end_date']