การกรอง Pandas DataFrames ตามวันที่


157

ฉันมี Pandas DataFrame พร้อมคอลัมน์ 'วันที่' ตอนนี้ฉันต้องกรองแถวทั้งหมดใน DataFrame ที่มีวันที่อยู่นอกสองเดือนถัดไป โดยพื้นฐานแล้วฉันจะต้องรักษาแถวที่อยู่ภายในสองเดือนถัดไป

อะไรคือวิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้?

คำตอบ:


238

หากคอลัมน์วันที่เป็นดัชนีให้ใช้. loc สำหรับการจัดทำดัชนีตามป้ายกำกับหรือ. iloc สำหรับการจัดทำดัชนีตำแหน่ง

ตัวอย่างเช่น:

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
คุณควรระบุว่าตัวกรองสำหรับดัชนี (ผ่าน.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เท่านั้น
Rafael Barbosa

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 indexer เลิกใช้แล้วใช้ loc - pandas.pydata.org/pandas-docs/stable/ ......
นิค

3
นุ่นจะแปลงสตริง "datetime" เป็นวัตถุ datetime .. ดังนั้นมันจึงถูกต้อง
janscas

8
ฉันได้รับข้อผิดพลาดต่อไปนี้โดยใช้สิ่งนี้: TypeError: '<' ไม่ได้รับการสนับสนุนระหว่างอินสแตนซ์ของ 'int' และ 'datetime.date'
Haris Khaliq

41

และหากวันที่ของคุณเป็นมาตรฐานโดยการนำเข้าแพ็คเกจวันที่และเวลาคุณสามารถใช้:

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

สำหรับการทำให้สตริงวันที่ของคุณเป็นมาตรฐานโดยใช้แพ็คเกจวันที่คุณสามารถใช้ฟังก์ชันนี้ได้:

import datetime
datetime.datetime.strptime

5
df[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))]ก็จะแนะนำให้ใช้
ดังนั้น

20

หากคอลัมน์วันที่และเวลาของคุณมีประเภทวันที่ของแพนด้า (เช่น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]


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 ได้หรือไม่
เกลน Moutrie

6

ดังนั้นเมื่อโหลดไฟล์ข้อมูล csv เราจะต้องตั้งค่าคอลัมน์วันที่เป็นดัชนีทันทีด้านล่างเพื่อกรองข้อมูลตามช่วงวันที่ ไม่จำเป็นสำหรับวิธีที่เลิกใช้แล้วในขณะนี้: pd.DataFrame.from_csv ()

หากคุณต้องการแสดงข้อมูลเป็นเวลาสองเดือนตั้งแต่เดือนมกราคมถึงกุมภาพันธ์เช่น 2020-01-01 ถึง 2020-02-29 คุณสามารถทำได้ดังนี้:

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_colจะต้องstringไม่ใช่รายการ 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

วิธีที่สั้นที่สุดในการกรอง dataframe ของคุณตามวันที่: สมมติว่าคอลัมน์วันที่ของคุณคือประเภทของ 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]

ที่จะกรองชุดข้อมูลให้คุณภายในเดือนมีนาคม


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.