日付でのPandas DataFramesのフィルタリング


157

「日付」列のあるPandas DataFrameがあります。次の2か月外の日付を持つDataFrameのすべての行をフィルターで除外する必要があります。基本的に、今後2か月以内の行のみを保持する必要があります。

これを達成するための最良の方法は何ですか?

回答:


238

日付列がインデックスの場合、ラベルベースのインデックスには.locを使用し、位置インデックスには.ilocを使用します。

例えば:

df.loc['2014-01-01':'2014-02-01']

詳細はこちらhttp://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

列がインデックスない場合は、2つの選択肢があります。

  1. インデックスにする(時系列データの場合は一時的または永続的に)
  2. df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]

参照してくださいここで、一般的な説明については、

注:.ixは非推奨です。


4
よろしくお願いします。日付は別の列であり、私の場合はインデックスではありません。そもそもそもそもその情報を与えていたはずだ。私の質問はあまり有益ではありませんでした。
AMM 2014

42
queryこちらでもご利用いただけます。df.query('20130101 < date < 20130201')
Phillip Cloud 14

10
例のインデックス(via .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 2017

6
日付範囲ではなく複数の日時でフィルタリングしたい場合はどうなりますか?
セーラムベンマブローク2018

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インデクサーは非推奨です。loc
Nick

3
パンダは "datetime"文字列をdatetimeオブジェクトに変換します。それで正しいです
janscas

8
TypeError: '<'は 'int'と 'datetime.date'のインスタンス間でサポートされていません
Haris Khaliq

41

また、datetimeパッケージをインポートすることで日付が標準化されている場合は、次のように使用できます。

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

datetimeパッケージを使用して日付文字列を標準化するには、次の関数を使用できます。

import datetime
datetime.datetime.strptime

5
の使用をお勧めしますdf[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))]
したがって、S


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を使用して参照し、タイムスタンプ文字列を提供できるようにします。


@ts関数のドキュメントへのリンクを渡してもらえますか?
グレンムートリー

6

そのため、csvデータファイルをロードするときは、日付の範囲に基づいてデータをフィルター処理するために、以下のように日付列をインデックスとして設定する必要があります。これは、現在非推奨のメソッドであるpd.DataFrame.from_csv()では必要ありませんでした。

1月から2月までの2か月のデータ(例: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_colstringリストではない必要があります。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

日付でデータフレームをフィルターする最も簡単な方法:日付列が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]

これにより、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.