पंडों डेटा फ़िल्टरिंग दिनांक पर


157

मेरे पास 'डेट' कॉलम के साथ पंडास डेटाफ़्रेम है। अब मुझे DataFrame की उन सभी पंक्तियों को फ़िल्टर करने की आवश्यकता है जो अगले दो महीनों के बाहर की हैं। अनिवार्य रूप से, मुझे केवल उन पंक्तियों को बनाए रखने की आवश्यकता है जो अगले दो महीनों के भीतर हैं।

इस लक्ष्य को हासिल करने का सबसे अच्छा तरीका क्या है?

जवाबों:


238

यदि दिनांक स्तंभ अनुक्रमणिका है , तो लेबल आधारित अनुक्रमण के लिए .loc का उपयोग करें या स्थितीय अनुक्रमण के लिए .ococ।

उदाहरण के लिए:

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
धन्यवाद, पढ़ेंगे तारीख एक अलग कॉलम है और मेरे मामले में सूचकांक नहीं है। मुझे शायद उस जानकारी को पहली जगह देनी चाहिए थी। मेरा प्रश्न बहुत जानकारीपूर्ण नहीं था।
एएमएम

42
आप queryयहाँ भी उपयोग कर सकते हैं । df.query('20130101 < date < 20130201')
फिलिप क्लाउड

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-012013-01-31
राफेल बारबोसा

4
इस कॉल को अब हटा दिया गया है!
मोहम्मद ताहिर अलरफ़ी

6
क्या होगा यदि कोई तिथि सीमा पर, लेकिन कई डेटासेट पर फ़िल्टर नहीं करना चाहता है?
सलेम बेन मब्रूक

53

पिछला उत्तर मेरे अनुभव में सही नहीं है, आप इसे एक साधारण स्ट्रिंग पास नहीं कर सकते, इसके लिए एक डेटाटाइम ऑब्जेक्ट होना चाहिए। इसलिए:

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

16
मैं पूरी तरह से बिना किसी मुद्दे के एक स्ट्रिंग पास कर सकता हूं।
Ninjakannon

9
ix इंडेक्सर को पदावनत किया जाता है, लोक का उपयोग करें - pandas.pydata.org/pandas-docs/stable/…
Nick

3
पांडा किसी भी "डेटाइम" स्ट्रिंग को
डेटाइम

8
मैं इसका उपयोग करते हुए निम्नलिखित त्रुटि को पुनः प्राप्त करता हूं: टाइपर्रर: '<' 'इंट' और 'डेटाइमटाइमडेट' के उदाहरणों के बीच समर्थित नहीं है
हरिस खलीक

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]

14

यदि दिनांक इंडेक्स में हैं तो बस:

df['20160101':'20160301']

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 के लिए पांडा के प्रलेखन पर एक नज़र डालें , विशेष रूप से स्थानीय वैरिएबल संदर्भित @उपसर्ग उपसर्ग के बारे में उल्लेख । इस मामले में हम pd.Timestampस्थानीय उपनाम का उपयोग करके tsएक टाइमस्टैम्प स्ट्रिंग की आपूर्ति करने में सक्षम होने का संदर्भ देते हैं


क्या आप @ फ़ंक्शंस के लिए प्रलेखन के लिए एक लिंक दे सकते हैं?
ग्लेन मॉट्री

6

तो जब सीएसवी डेटा फ़ाइल लोड हो रही है, तो हमें तारीखों की श्रेणी के आधार पर डेटा फ़िल्टर करने के लिए, नीचे दिए गए दिनांक कॉलम को अब सूचकांक के रूप में सेट करना होगा। अब पदावनत विधि के लिए इसकी आवश्यकता नहीं थी: 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'] 

यह पायथन 3.7 के लिए काम कर रहा है। आशा है कि आपको यह उपयोगी लगेगा।


1
index_colएक हो गया है stringएक सूची नहीं। mydata = pd.read_csv('mydata.csv',index_col='date')
शरल शेरिफ

5

कैसे उपयोग के बारे में pyjanitor

इसमें शांत विशेषताएं हैं।

उपरांत pip install pyjanitor

import janitor

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

2

तिथि द्वारा अपने डेटाफ़्रेम को फ़िल्टर करने का सबसे छोटा तरीका: मान लीजिए कि आपका दिनांक स्तंभ डेटाइम 64 का प्रकार है [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")]


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.