非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Python】DataFrameで時系列データを1日単位に処理する方法

   

データ分析や時系列データを扱うときにデータを日付単位で処理する必要があることがあります。例えばデータが1時間ごとの記録であれば1日ごとにデータをまとめて処理したい場合です。そこで今回は、Pandasを使って「1時間おきの時系列データを1日おきにデータを処理し、開始と終了のインデックス番号を取得する」方法をサンプルコード付きで解説します。これができれば5分おきなどの時系列データにも応用できると思います。

サンプルデータの準備

まずは、1時間おきのデータを含むサンプルデータを作成します。2024/1/1 00:00:00 から1ヶ月分の1時間毎のデータが生成されます。

import pandas as pd

# サンプルデータを作成
data = {
    'Date': pd.date_range(start='2024-01-01', periods=24*31, freq='H'),
    'Data': [i for i in range(24*31)]
}
df = pd.DataFrame(data)

print(df.head())
 

 

実行結果:
                 Date  Data
0 2024-01-01 00:00:00     0
1 2024-01-01 01:00:00     1
2 2024-01-01 02:00:00     2
3 2024-01-01 03:00:00     3
4 2024-01-01 04:00:00     4
 

 

日付ごとにforループし各開始終了インデックスを取得する

次に、Date列から1日ごとにデータをグループ化し、各日の開始インデックスと終了インデックスを取得するプログラムを記述します。

# Date列の日付部分だけ取得
df['Day'] = df['Date'].dt.date

# 日付ごとにグループ化してインデックスを取得
for day, group in df.groupby('Day'):
    start_index = group.index.min()
    end_index = group.index.max()
    print(f"日付: {day}, 開始インデックス: {start_index}, 終了インデックス: {end_index}")
 

 

実行結果:
日付: 2024-01-01, 開始インデックス: 0, 終了インデックス: 23
日付: 2024-01-02, 開始インデックス: 24, 終了インデックス: 47
日付: 2024-01-03, 開始インデックス: 48, 終了インデックス: 71
日付: 2024-01-04, 開始インデックス: 72, 終了インデックス: 95
日付: 2024-01-05, 開始インデックス: 96, 終了インデックス: 119
日付: 2024-01-06, 開始インデックス: 120, 終了インデックス: 143
 :

 

解説
  1. Date列から日付だけ抽出
    • df[‘Date’].dt.dateを使用して、時刻を含まない日付情報を新しい列Dayとして追加します。
  2. groupbyで日付ごとにデータを分ける
    • df.groupby(‘Day’)で、Day列をキーとしてデータをグループ化します。
  3. インデックス番号の取得
    • 各日付グループのインデックスをgroup.indexから取得し、最小値(開始インデックス)と最大値(終了インデックス)を計算します。

応用例

この方法を応用することで、各日のデータに対して任意の集計や処理を実施することも可能です。例えば、各日のデータの平均値を計算したい場合は以下のようにします:

# 各日のデータ平均値を計算
for day, group in df.groupby('Day'):
    daily_avg = group['Data'].mean()
    print(f"日付: {day}, 平均値: {daily_avg}")
 

 

実行結果:
日付: 2024-01-01, 平均値: 11.5
日付: 2024-01-02, 平均値: 35.5
日付: 2024-01-03, 平均値: 59.5
日付: 2024-01-04, 平均値: 83.5
日付: 2024-01-05, 平均値: 107.5
 :

 

まとめ

Pandasを使えば、日付単位でデータを処理するのは非常に簡単です。今回紹介した方法を応用して時系列データの分析を効率化してみてください。インデックス番号を取得することで、元データの位置情報を活用した高度な分析も可能です。

 

スポンサーリンク

 - Python