前提・実現したいこと
pythonでの日付・時刻に関する演算に関する質問です。
datetimeをdt、pandasをpdと書きます。
具体的には、dt.datetime型の値(年、月、日、時、分、秒)を持つpd.Seriesがあるとします。
それらの日付・時刻の値の時刻部分(時、分、秒)に対して、それらの時刻より遅いある決まった時刻(例えば、22時0分0秒)からの差分を計算し、秒単位で求めたいです。
一旦差分を算出できれば、.total_seconds()で秒換算すれば良いと思うのですが、効率的に差分を計算するやり方が分かりません。
試したこと
例えば、
endtime = (22,0,0)
date = pd.Seriesの日付データ
として forループで
tmp = dt.datetime.combine(date_[i], dt.time(*endtime)) - data[i]
などとdatetime型の差として計算する関数を作って計算してみましたが、非常に時間がかかるので途中で計算を中止させました。
以下のようにできれば楽なのですが、dt.datetimeはpd.Seriesを引数に取れないようです
Python
1dt.datetime(date.dt.year, date.dt.month, date.dt.day, *endtime) - date
(追記)
昨日は、時間がかかって途中でやめてしまったのですが、プログラムを一部修正して改めて実施したところ、一応、計算結果が出ました。
Python
1def remtime(data, date_column, endtime): 2 """ 3 data: pd.DataFrameのデータ 4 date_column: dataの中のdt.datetime型の値(年、月、日、時、分、秒)を持つカラム 5 endtime: date_columnの時刻の値と比較したい固定した時刻(dt.time型)を作成するためのパラメータのタプル(時、分、秒) 6 return: dataの中に、endtimeとdate_columnの差分を秒換算した値を持つ新しいカラム'ddelta'を加えて返す 7 """ 8 date = data[date_column].dt.date 9 data['ddelta'] = 0 10 for i in range(data.shape[0]): 11 tmp = dt.datetime.combine(date.iloc[i], dt.time(*endtime)) - data[date_column].iloc[i] 12 data['ddelta'].iloc[i] = tmp.total_seconds() 13 return data
行数390万件程度のデータで上記関数で計算させた際の計算時間は、以下の通りでした:
CPU times: user 1min 49s, sys: 1.89 s, total: 1min 51s
Wall time: 1min 49s
補足情報(FW/ツールのバージョンなど)
回答3件
あなたの回答
tips
プレビュー