私は、1 か月間、1 日 24 時間、毎日、1 分ごとの外国為替価格のデータセットを持っています。ただし、外国為替市場は実際には日曜日の 17:00 から金曜日の 16:00 までしか開いていません。これらの時間の間のデータは、金曜日の夜に最後に記録された値で埋められます。このパディングを削除して、マーケット オープン データのみを残そうとしています。
私は何十もの行き止まりを下って行き、木のための木を完全に失いました。
指定された時間枠に従ってデータのサブセットを返すのは非常に簡単です。
import pandas as pd
df = pd.read_csv(tickdatafile,index_col='dtime',parse_dates=True)
# Return all rows for times between 12:00 and 16:00
df = df.between_time('12:00','16:00')
最初の 2 行は、csv ファイルからデータフレームを作成し、「dtime」列をインデックスとして割り当て、datetime オブジェクトとして解析します。3 行目は、曜日に関係なく、12:00 から 16:00 までのすべての行を返します。
シンプルな 1 行のソリューションは (疑似コード) のようになります。
df = df.between_customTimeRange('Sun 17:00','Fri 16:00')
しかし、明らかに、これは機能しません。
私が完全に見落としている単純なものはありますか?
編集: EKomarov と Alexander の回答を最初から最後まで次のソリューションにまとめました。
import pandas as pd
df = pd.read_csv(tickdatafile,index_col='dtime',parse_dates=True)
mask = df[ ( ( df.index.weekday == 6 ) & ( df.index.hour < 17 ) )# Sunday pre 17:00
| ( df.index.weekday == 5 ) # All of Saturday
| ( ( df.index.weekday == 4 ) # Friday
& ( ( df.index.hour >= 16 ) # Friday 16.00 onwards
& ~( ( df.index.hour == 16 )
& ( df.index.minute == 0 )# Exclude 16.00 itself
)
)
)
]
df = df[~df.index.isin(mask.index)] # return all data not in mask
df.to_csv(tradingdaysonly)