web-dev-qa-db-ja.com

日付によるPandas DataFrameのフィルタリング

「日付」列を含むPandas DataFrameがあります。今、私は次の2ヶ月の外側の日付を持つDataFrame内のすべての行を除外する必要があります。基本的に、私は今後2ヶ月以内にある行を保持する必要があるだけです。

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

93
AMM

日付列がインデックスの場合は、ラベルベースのインデックス作成には.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は非推奨です。

153
Retozi

以前の答えは私の経験では正しくありません、あなたはそれに単純な文字列を渡すことはできません、日時オブジェクトである必要があります。そう:

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

そしてdatetimeパッケージをインポートすることであなたの日付が標準化されているなら、あなたは単に使うことができます:

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

Datetimeパッケージを使って日付文字列を標準化するために、この関数を使うことができます。

import datetime
datetime.datetime.strptime
25
shm2008

もしあなたのdatetimeカラムがPandasのdatetimeタイプ(例えば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
VMAtm

日付がインデックスにある場合は、単純に次のようにします。

df['20160101':'20160301']
10
fantabolous

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
1
danielhrisca