Pythonで時を操る!Pandas.Period.hour属性で時間帯分析を自由自在に


pandas.Period.hour は、pandas ライブラリで時刻情報を扱うための強力な属性です。Period 型のデータフレームにおける各期間の "時間" 情報を整数値として取得できます。データ分析や可視化において、時間帯に特化した分析や、特定の時間のデータを取り出す際に役立ちます。

属性の詳細

  • 用途
    • 特定の時間のデータを取り出す
    • 時間帯ごとのデータ分析
    • 時刻情報に基づいたデータの可視化
  • データ型
    整数型 (int)
  • 取得できる情報
    指定された期間における "時間" 情報を 0 から 23 の範囲で整数値として返します。

import pandas as pd

# データの作成
dates = pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03'])
periods = pd.Period(dates, freq='D')  # 日付を Period 型に変換

# 時間情報の取得
print(periods.hour)

出力

0
0
0
Name: 0, dtype: int64

上記のように、pandas.Period.hour 属性を用いることで、各期間の "時間" 情報を簡単に取得できます。

  • 時間帯ごとの顧客行動を可視化する
  • 曜日と時間帯を組み合わせたデータ分析を行う
  • 時間帯ごとの売上推移を分析する
  • 特定の時間帯 (例: 午前9時~11時) のデータを取り出す
  • データ分析や可視化の目的に合わせて、適切な属性を選択することが重要です。
  • pandas.Period 型には、hour 属性以外にも year, month, day, week, quarter, weekday など、様々な時刻情報にアクセスできる属性があります。


import pandas as pd

# データの作成
dates = pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'])
values = [10, 20, 30, 40]
periods = pd.Period(dates, freq='D')
df = pd.DataFrame({'Date': dates, 'Value': values})
df['Period'] = periods

# 特定の時間帯のデータのみ抽出
morning_data = df[df['Period'].hour.between(9, 11)]

print(morning_data)

出力

      Date  Value  Period
2 2024-01-02   20    2024-01-02
3 2024-01-03   30    2024-01-03

この例では、pandas.Period.hour 属性と集計処理を用いて、時間帯ごとの売上推移を分析します。

import pandas as pd

# データの作成
dates = pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'])
values = [10, 20, 30, 40, 50, 60]
periods = pd.Period(dates, freq='D')
df = pd.DataFrame({'Date': dates, 'Value': values})
df['Period'] = periods

# 時間帯ごとの売上集計
hourly_sales = df.groupby('Period')['Value'].sum().reset_index()

print(hourly_sales)

出力

   Period  Value
0 2024-01-01    10
1 2024-01-02    50
2 2024-01-03    30
3 2024-01-04    60

この例では、pandas.Period.hour 属性と weekday 属性を組み合わせることで、曜日と時間帯ごとのデータ分析を行います。

import pandas as pd

# データの作成
dates = pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05', '2024-01-06'])
values = [10, 20, 30, 40, 50, 60]
periods = pd.Period(dates, freq='D')
df = pd.DataFrame({'Date': dates, 'Value': values})
df['Period'] = periods
df['Weekday'] = df['Period'].weekday

# 曜日と時間帯ごとの売上集計
weekday_hourly_sales = df.groupby(['Weekday', 'Period.hour'])['Value'].sum().unstack()

print(weekday_hourly_sales)
       0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23
Weekday
0     NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  10  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1     NaN  NaN


そこで、ここでは pandas.Period.hour の代替方法として、以下の3つの方法をご紹介します。

dt.hour 属性を使用する

pandas.Period 型データフレームは、dt 属性を持つ pandas.Index オブジェクトとして内部的に表現されます。この dt 属性には、hour 属性を含む様々な時刻情報属性が用意されています。

import pandas as pd

# データの作成
dates = pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03'])
periods = pd.Period(dates, freq='D')
df = pd.DataFrame({'Date': dates, 'Value': [10, 20, 30]})
df['Period'] = periods

# dt.hour 属性で時間情報取得
print(df['Period'].dt.hour)

出力

0    0
1    0
2    0
Name: Period, dtype: int64

strftime() 関数を使用する

strftime() 関数は、datetime 型オブジェクトに対して書式指定された文字列を生成する関数です。Period 型データフレームは datetime 型オブジェクトに変換できるので、strftime() 関数を使って "時間" 情報を含む文字列を取得できます。

import pandas as pd

# データの作成
dates = pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03'])
periods = pd.Period(dates, freq='D')
df = pd.DataFrame({'Date': dates, 'Value': [10, 20, 30]})
df['Period'] = periods

# strftime() 関数で時間情報取得
print(df['Period'].dt.strftime('%H'))

出力

0    00
1    00
2    00
Name: Period, dtype: object

lambda 関数を使用する

lambda 関数を使って、Period 型オブジェクトから "時間" 情報を抽出する匿名関数を作成することもできます。

import pandas as pd

# データの作成
dates = pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03'])
periods = pd.Period(dates, freq='D')
df = pd.DataFrame({'Date': dates, 'Value': [10, 20, 30]})
df['Period'] = periods

# lambda 関数で時間情報取得
print(df['Period'].apply(lambda x: x.hour))

出力

0    0
1    0
2    0
Name: Period, dtype: int64
方法利点欠点
dt.hour 属性シンプルで分かりやすいPeriod 型データフレームに dt 属性が追加される
strftime() 関数書式を自由に設定できる文字列処理が必要
lambda 関数柔軟性が高いコードが冗長になる可能性がある