実現したいこと
下記のようなデータを
date_strs = ['2020-01-01 12:00:00', '2020-01-01 12:00:00', '2020-01-01 12:00:58 005', '2020-01-01 12:01:00', '2020-01-01 12:01:00', '2020-01-01 12:00:00', '2020-01-01 12:00:00', '2020-01-01 12:00:45 008', '2020-01-01 12:00:00', '2020-01-01 12:00:00']
下記のようにミリセックがないデータを3秒周期で補完したいです。
ただ、時系列順に並んでいない場合もあるため前にも同じ分数がある場合は以降に出てくるミリセックが含まれているデータをもとに補完したいです。
[Timestamp('2020-01-01 12:00:52'),
Timestamp('2020-01-01 12:00:55'),
Timestamp('2020-01-01 12:00:58'),
Timestamp('2020-01-01 12:01:01'),
Timestamp('2020-01-01 12:01:04'),
Timestamp('2020-01-01 12:00:39'),
Timestamp('2020-01-01 12:00:42'),
Timestamp('2020-01-01 12:00:45'),
Timestamp('2020-01-01 12:00:48'),
Timestamp('2020-01-01 12:00:51')]
前提
ここに質問の内容を詳しく書いてください。
(例)
現状、下記のプログラムを実行すると
[Timestamp('2020-01-01 12:00:52'),
Timestamp('2020-01-01 12:00:55'),
Timestamp('2020-01-01 12:00:58'),
Timestamp('2020-01-01 12:01:01'),
Timestamp('2020-01-01 12:01:04'),
Timestamp('2020-01-01 12:01:07'),
Timestamp('2020-01-01 12:01:10'),
Timestamp('2020-01-01 12:00:45'),
Timestamp('2020-01-01 12:00:48'),
Timestamp('2020-01-01 12:00:51')]
のようにうまく補完できません。
該当のソースコード
import pandas as pd def adjust_and_complete_timestamps_with_comparison(date_strs, format='%Y-%m-%d %H:%M:%S %f'): parsed_dates = [] # 解析済みの日時を格納するリスト last_completed_date = None # 最後に補完された日時 for date_str in date_strs: try: current_date = pd.to_datetime(date_str, format=format, errors='raise').replace(microsecond=0) parsed_dates.append(current_date) last_completed_date = current_date except ValueError: if last_completed_date is not None: # 直前に補完された日時から3秒後の日時を提案 proposed_date = last_completed_date + pd.Timedelta(seconds=3) if parsed_dates and proposed_date.minute < last_completed_date.minute: # 直後の有効な日時を探す for future_date_str in date_strs[len(parsed_dates):]: try: future_date = pd.to_datetime(future_date_str, format=format, errors='raise').replace(microsecond=0) # 直後の有効な日時から適切な補完を行う diff = (future_date - proposed_date).total_seconds() // 3 proposed_date = future_date - pd.Timedelta(seconds=3 * diff) break except ValueError: continue parsed_dates.append(proposed_date) last_completed_date = proposed_date else: # 最初の有効な日時がまだ見つかっていない場合 parsed_dates.append(None) # None値を補完 for i in range(len(parsed_dates)): if parsed_dates[i] is None: # 直後の有効な日時から逆算して補完 for j in range(i + 1, len(parsed_dates)): if parsed_dates[j] is not None: parsed_dates[i] = parsed_dates[j] - pd.Timedelta(seconds=3 * (j - i)) break return parsed_dates # 使用例 date_strs = ['2020-01-01 12:00:00', '2020-01-01 12:00:00', '2020-01-01 12:00:58 005', '2020-01-01 12:01:00', '2020-01-01 12:01:00', '2020-01-01 12:00:00', '2020-01-01 12:00:00', '2020-01-01 12:00:45 008', '2020-01-01 12:00:00', '2020-01-01 12:00:00'] adjusted_dates_with_comparison = adjust_and_complete_timestamps_with_comparison(date_strs) adjusted_dates_with_comparison