日時による条件抽出 - Python Pandas
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型を比較してしまっていることが問題
再現と、改善方法
- 再現補法
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徹底解説
おすすめ記事
音楽ファイルの時間をpythonで取得(ffmpeg使用)
Omni chat google extension 作成しました
Blender Bone - Python
エラーを解消したい ModuleNotFoundError: No module named ‘openpyxl’ - Python
エラーを解消したい PermissionError: [Errno 13] Permission denied: ファイル名 - Python
文字列による条件抽出 - Python Pandas
Supponsered
もっとPythonを学びたいなら
Python徹底解説
Python - OpenCV徹底解説
外部サイト
↓プログラムを学んでみたい場合、学習コースなどもおすすめです!