2つの日付の間のDataFrameの行を選択する

以下のようにcsvからDataFrameを作成しています。

stock = pd.read_csv('data_in/' + filename + '.csv', skipinitialspace=True)

このDataFrameには日付の列があります。指定された日付の範囲内、または指定された2つの日付の間にある日付の値を持つ行のみを含む新しいDataFrameを作成する(または既存のDataFrameを上書きする)方法はありますか?

ソリューション

解決策は2つあります。

  • ブール値のマスクを使用し、df.loc[mask]を使用します。
  • 日付列をDatetimeIndexとして設定し、df[start_date : end_date]を使用する。

ブーリアンマスクを使用する

df['date']がdtypedatetime64[ns]`のSeriesであることを確認します。

df['date'] = pd.to_datetime(df['date'])  

ブーリアンマスクを作成します。start_dateend_dateには、datetime.datetimeを使用できます。 start_dateend_dateは、datetime.datetimenp.datetime64pd.Timestamp、またはdatetimeの文字列です。


#greater than the start date and smaller than the end date
mask = (df['date'] > start_date) & (df['date']  '2000-6-1') & (df['date'] 
解説 (6)

ロック機能を使うよりも、ダイレクトチェックを使うのがベストな選択だと感じています。


df = df[(df['date'] > '2000-6-1') & (df['date'] 
解説 (2)

date列に対して、以下のようにisinメソッドを使うことができます。 df[df["date"].isin(pd.date_range(start_date, end_date))]`。

Note: これは(質問にあるように)日付でのみ動作し、タイムスタンプでは動作しません。

例:

import numpy as np   
import pandas as pd

# Make a DataFrame with dates and random numbers
df = pd.DataFrame(np.random.random((30, 3)))
df['date'] = pd.date_range('2017-1-1', periods=30, freq='D')

# Select the rows between two dates
in_range_df = df[df["date"].isin(pd.date_range("2017-01-15", "2017-01-20"))]

print(in_range_df)  # print result

となります。

           0         1         2       date
14  0.960974  0.144271  0.839593 2017-01-15
15  0.814376  0.723757  0.047840 2017-01-16
16  0.911854  0.123130  0.120995 2017-01-17
17  0.505804  0.416935  0.928514 2017-01-18
18  0.204869  0.708258  0.170792 2017-01-19
19  0.014389  0.214510  0.045201 2017-01-20
解説 (0)