তারিখে পান্ডাস ডেটা ফ্রেম ফিল্টারিং


157

আমার কাছে একটি 'তারিখ' কলাম সহ একটি পান্ডাস ডেটা ফ্রেম রয়েছে। এখন আমার ডাটাফ্রেমের সমস্ত সারি ফিল্টার করতে হবে যা পরের দুই মাসের বাইরে তারিখ রয়েছে। মূলত, আমার কেবলমাত্র পরবর্তী দুই মাসের মধ্যে থাকা সারিগুলি ধরে রাখা দরকার।

এই অর্জন করার জন্য সবচেয়ে ভাল উপায় কি?

উত্তর:


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
আপনাকে ধন্যবাদ, পড়তে হবে। তারিখটি পৃথক কলাম এবং আমার ক্ষেত্রে সূচি নয়। আমার সম্ভবত সেই তথ্যটি প্রথম স্থানে দেওয়া উচিত ছিল। আমার প্রশ্ন খুব তথ্যপূর্ণ ছিল না।
এএমএম

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-01, এটি শুধুমাত্র পর্যন্ত সারি ম্যাচ হবে 2013-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
আমি একেবারে কোনও সমস্যা ছাড়াই একটি স্ট্রিং পাস করতে পারি।
নিনজাকাননন

9
ix ইনডেক্সার অবহিত
নিক

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]), সঠিক ফিল্টারিংয়ের জন্য আপনার পিডি প্রয়োজন need টাইমস্ট্যাম্প অবজেক্ট , উদাহরণস্বরূপ:

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

আপনি একটি ক্যোয়ারী এবং স্থানীয় রেফারেন্স সম্পাদন করতে পিডিটাইমস্ট্যাম্প ব্যবহার করতে পারেন

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

ডেটাফ্রেম.কোয়ারির জন্য পান্ডাস ডকুমেন্টেশনগুলি দেখুন , বিশেষত স্থানীয় ভেরিয়েবিল রেফারেন্স করা উডসিং @উপসর্গ সম্পর্কে উল্লেখ । এই ক্ষেত্রে আমরা টাইমস্ট্যাম্প স্ট্রিং সরবরাহ করতে সক্ষম হতে pd.Timestampস্থানীয় উপনামটি ব্যবহার করে উল্লেখ করিts


আপনি কি @ts ফাংশনগুলির জন্য ডকুমেন্টেশনের জন্য একটি লিঙ্কটি পাস করতে পারবেন?
গ্লেন মাউত্রি

6

সুতরাং সিএসভি ডেটা ফাইল লোড করার সময়, তারিখের একটি পরিসরের উপর ভিত্তি করে ডেটা ফিল্টার করার জন্য আমাদের এখন নীচে হিসাবে সূচী হিসাবে তারিখ কলাম সেট করতে হবে। এখন অবহেলিত পদ্ধতির জন্য এটির দরকার হয়নি: পিডি.ডাটাফ্রেম.ফ্রম_সিএসভি ()।

আপনি যদি জানু থেকে ফেব্রুয়ারী, যেমন 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'] 

এটি পাইথন ৩.7 এর জন্য কাজ করে পরীক্ষা করা হয়েছে। আশা করি আপনি এটি দরকারী পাবেন।


1
index_colstringএকটি তালিকা হতে হবে না। 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 [এনএস]

# 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

আপনি যদি ইতিমধ্যে পিডি.টো_ডেটটাইম ব্যবহার করে স্ট্রিংটিকে তারিখ বিন্যাসে রূপান্তর করেন তবে আপনি কেবল ব্যবহার করতে পারেন:

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


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.