日時による条件抽出 - Python Pandas

 

{{DZ_TITLE}}
Python Pandasで、日時を使った条件抽出を行う方法です。

基本形

query方式

df.query('Date > "2020-05-01 18:00" )
df.query('Date > "2020/5/1"')

date_val = dt(2020,5,1)
df.query('Date > @date_val')

date_val = dt(2020,5,1)
df.query('Date > @date_val')

df[df[~]] 形式

# 抽出条件がInddxの場合
df['2020-05-01' : '2020-05-01']
df['2020-05-01 18:00' : '2020-05-01 19:30']

# 抽出条件が非Indexの場合
df[df['Date'] > dt(2020,5,1)]
df[( dt(2020,5,1) < df['Date'] ) & ( df['Date'] < dt(2020,5,3) ) ]
df[df['Date'] > dt(2020,5,1,18,30)]
df[( dt(2020,5,1,1,20) < df['Date'] ) & ( df['Date'] < dt(2020,5,4,15,23) ) ]

サンプル

import pandas as pd
from datetime import datetime as dt
df = pd.DataFrame({
    'DateTime' : ['2020/04/30 10:12','2020/05/02 11:24','2020/05/03 18:23'],
    'Cost' : [100 , 200 , 150 ]})
# Timestamp の型をdatetime型に変換する
df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d')

# 範囲指定 下記のいずれかの様な条件が可能
df[df['Date'] > dt(2020,5,1)]
df[( dt(2020,5,1) < df['Date'] ) & ( df['Date'] < dt(2020,5,3) ) ]

df.query('Date > "2020/5/1"')

date_val = dt(2020,5,1)
df.query('Date > @date_val')

date_val = dt(2020,5,1,12,34,23)
df.query('Date > @date_val')
import pandas as pd
from datetime import datetime as dt
df = pd.DataFrame({
    'DateTime' : ['2020/04/30 10:12','2020/05/02 11:24','2020/05/03 18:23'],
    'Cost' : [100 , 200 , 150 ]})
# Timestamp の型をdatetime型に変換する
df['DateTime'] = pd.to_datetime(df['DateTime'], format='%Y/%m/%d %H:%S')

# 範囲指定(以下いずれか使用)
df[df['DateTime'] > dt(2020,5,1)]
df[df['DateTime'] > dt(2020,5,1,12,1)]
df[( dt(2020,5,1,1,20) < df['DateTime'] ) & ( df['DateTime'] < dt(2020,5,2,15,23) ) ]

よくあるエラーメッセージ

TypeError: Invalid comparison between dtype=datetime64[ns] and date

datetime型とdate型を比較してしまっていることが問題

再現と、改善方法

  1. 再現補法
import datetime
import pandas as pd
from datetime import datetime as dt
df = pd.DataFrame({
    'Date' : ['2020/04/30', '2020/05/02', '2020/05/03', '2020/05/04', '2020/05/05'],
    'Cost' : [100         , 200         , 150         , 152         , 10          ]})
# Timestamp の型をdatetime型に変換する
df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d')
df[df['Date'] > datetime.date(2010,2,1)]

最後の1行を、例えば、下記の様にOrdinal経由で dateからdatetimeに変換するなどする必要があります。

# df[df['Date'] > datetime.date(2010,2,1)]
df[df['Date'] > dt.fromordinal(datetime.date(2010,2,1).toordinal())]

今回の様に日付が直接書いてあるの場合、当然本来はこちらがベスト。

# df[df['Date'] > datetime.date(2010,2,1)]
df[df['Date'] > dt(2010,2,1)]

関連

数値による条件抽出 - Python Pandas徹底解説
文字による条件抽出 - Python Pandas徹底解説
Python - Pandas徹底解説

おすすめ記事

Django テンプレート 使用 #3 List Dictの表示
Django テンプレート 使用 #3 List Dictの表示
競馬とかのOdds計算をPythonでしてみる
競馬とかのOdds計算をPythonでしてみる
JSONの書込み、読込 等 - Python徹底解説
JSONの書込み、読込 等 - Python徹底解説
エラーを解消したい ModuleNotFoundError: No module named ‘xlwt’ - Python
エラーを解消したい ModuleNotFoundError: No module named ‘xlwt’ - Python
文字列による条件抽出 - Python Pandas
文字列による条件抽出 - Python Pandas
read_csvでCSV,TSVファイルを読み込む / Python Pandas
read_csvでCSV,TSVファイルを読み込む / Python Pandas
Supponsered

もっとPythonを学びたいなら

Python徹底解説
Python - OpenCV徹底解説

外部サイト
↓プログラムを学んでみたい場合、学習コースなどもおすすめです!

Comments

comments powered by Disqus