Pandasで時刻計算をマスター!24時間表記を10進数に変換する方法

目次

はじめに

こんにちは!みなさんは、時間データの処理に苦労したことはありませんか?

「勤務時間の計算を自動化したいけど、24時間表記の時刻データをどう扱えばいいのかわからない…」 「時刻データを使って計算したいけど、そのままでは足し算や引き算ができなくて困っている…」

こんな悩みを抱えている方は多いのではないでしょうか。特に、PythonのPandasを使ってデータ分析をしているときに、このような問題に直面することがよくあります。

そこで今回は、Pandasで24時間表記の時刻文字列を10進数の数値(時間単位)に変換し、計算可能な形式にする方法を、初心者の方にもわかりやすく丁寧に解説していきます!

この記事で学べること

この記事を読めば、以下のようなことができるようになります。

  1. 24時間表記の時刻文字列(例:"15:30")を、時間単位の10進数(例:15.5)に変換する
  2. 変換した数値を使って、勤務時間の計算や時刻間の差分の算出などができるようになる
  3. 時刻データを扱う際の、文字列と数値の違いを理解する
  4. Pandasの便利な関数を使って、効率的にデータ処理を行う方法を学ぶ

なぜ時刻文字列を数値に変換する必要があるのか?

時刻データは、見た目上は数値のように見えますが、Pandas上では単なる文字列として扱われていることが多くあります。

例えば、以下のようなデータフレームを考えてみましょう。

import pandas as pd

df = pd.DataFrame({
    '社員ID': ['A001', 'A002', 'A003'],
    '出勤時刻': ['9:00', '9:30', '10:00'],
    '退勤時刻': ['18:00', '19:00', '18:30']
})
社員ID出勤時刻退勤時刻
A0019:0018:00
A0029:3019:00
A00310:0018:30

このデータフレームでは、「出勤時刻」と「退勤時刻」の列が時刻データのように見えますね。しかし、これらの列のデータ型を確認してみると、

print(df.dtypes)
社員ID    object
出勤時刻    object
退勤時刻    object
dtype: object

object型、つまり文字列として認識されていることがわかります。

このままでは、勤務時間の計算をしようとしても、

df['勤務時間'] = df['退勤時刻'] - df['出勤時刻'] # このように単純な引き算はできない

といった問題が発生します。

そのため、時刻を表す文字列を数値データに変換し、計算可能な形式にすることが必要なのです。

時刻文字列を10進数に変換する3つのステップ

それでは、24時間表記の時刻文字列("HH:MM"形式)を時間単位の10進数に変換する手順を、3つのステップで解説します。

ステップ1: str.split()で時と分に分割

まず、文字列の.str.split()メソッドを使って、時刻文字列を「時」と「分」に分割します。

# '出勤時刻'列を':'で分割し、'時'と'分'の列を作成
df[['出勤時', '出勤分']] = df['出勤時刻'].str.split(':', expand=True).astype(int)
df[['退勤時', '退勤分']] = df['退勤時刻'].str.split(':', expand=True).astype(int)
社員ID出勤時刻退勤時刻出勤時出勤分退勤時退勤分
A0019:0018:0090180
A0029:3019:00930190
A00310:0018:301001830
  • str.split(':')で、各時刻文字列を:で分割します。
  • expand=Trueを指定することで、分割した結果を別々の列に展開しています。
  • .astype(int)で分割した文字列を整数(int型)に変換しています。

ステップ2: 分を時間単位に変換

次に、「分」を時間単位に変換します。1時間は60分なので、分の値を60で割ります。

# '出勤分'と'退勤分'を時間単位に変換
df['出勤分'] = df['出勤分'] / 60
df['退勤分'] = df['退勤分'] / 60
社員ID出勤時刻退勤時刻出勤時出勤分退勤時退勤分
A0019:0018:0090.0180.0
A0029:3019:0090.5190.0
A00310:0018:30100.0180.5

ステップ3: 時と分を合計して10進数にする

最後に、「時」と、時間単位に変換した「分」を合計します。

# '出勤時'と'出勤分'を合計して10進数の時刻を作成
df['出勤時刻_10進数'] = df['出勤時'] + df['出勤分']
df['退勤時刻_10進数'] = df['退勤時'] + df['退勤分']
社員ID出勤時刻退勤時刻出勤時出勤分退勤時退勤分出勤時刻_10進数退勤時刻_10進数
A0019:0018:0090.0180.09.018.0
A0029:3019:0090.5190.09.519.0
A00310:0018:30100.0180.510.018.5

これで、"HH:MM"形式の時刻文字列が、時間単位の10進数(HH.hh形式)に変換されました!

変換した数値を使って計算する

10進数に変換することで、時刻データを使った計算が簡単にできるようになります。

例えば、各社員の勤務時間を計算するには、以下のように「退勤時刻_10進数」から「出勤時刻_10進数」を引くだけです。

# 勤務時間を計算
df['勤務時間'] = df['退勤時刻_10進数'] - df['出勤時刻_10進数']
社員ID出勤時刻退勤時刻出勤時出勤分退勤時退勤分出勤時刻_10進数退勤時刻_10進数勤務時間
A0019:0018:0090.0180.09.018.09.0
A0029:3019:0090.5190.09.519.09.5
A00310:0018:30100.0180.510.018.58.5

簡単ですね!

1行でまとめて変換する

上記の手順をlambda関数とapply()メソッドを使うことで、1行で書くこともできます。

# '出勤時刻'列に適用する関数を定義
df['出勤時刻_10進数'] = df['出勤時刻'].apply(lambda x: int(x.split(':')[0]) + int(x.split(':')[1]) / 60)
df['退勤時刻_10進数'] = df['退勤時刻'].apply(lambda x: int(x.split(':')[0]) + int(x.split(':')[1]) / 60)
社員ID出勤時刻退勤時刻出勤時刻_10進数退勤時刻_10進数
A0019:0018:009.018.0
A0029:3019:009.519.0
A00310:0018:3010.018.5
  • lambda x:は無名関数(その場で使い捨ての関数)を定義しています。
  • apply()は、データフレームの各要素(ここでは各行の’出勤時刻’の値)に関数を適用します。

コードが簡潔になり、処理も高速です。

応用例:時刻データの集計

変換した数値データを使えば、様々な集計処理も簡単にできます。

例えば、以下のようなことができます。

  1. 社員ごとの平均勤務時間を計算する
  2. 部署ごとの総勤務時間を計算する
  3. 特定の時間帯の勤務回数をカウントする

これらの処理も、数値データに変換することで、Pandasの強力な集計機能を活用して効率的に行うことができます。

まとめ

今回は、Pandasで24時間表記の時刻文字列を10進数の数値に変換し、計算可能な形式にする方法を解説しました。

ポイント

  • 時刻文字列は、そのままでは計算に使いにくい
  • .str.split()/60+の3ステップで数値に変換
  • lambda関数とapply()で効率化
  • 数値に変換することで、勤務時間の計算や様々な集計処理が可能に

この方法をマスターすれば、時刻データを含むデータ分析が格段に効率化されるはずです。ぜひ実務で活用してみてください!

おまけ:to_datetime()を使う方法

Pandasのto_datetime()関数を使っても、時刻文字列を日時のデータ型(datetime64)に変換することができます。 ただし、この場合は日付の情報が一緒に付与され、計算を行う際には注意が必要です。この説明は長くなるので今回は省略します。

Python

# 日付の情報がついてしまう
df['出勤時刻_datetime'] = pd.to_datetime(df['出勤時刻'])
df['退勤時刻_datetime'] = pd.to_datetime(df['退勤時刻'])
print(df.dtypes)
社員ID出勤時刻退勤時刻出勤時刻_datetime退勤時刻_datetime
A0019:0018:001900-01-01 09:00:001900-01-01 18:00:00
A0029:3019:001900-01-01 09:30:001900-01-01 19:00:00
A00310:0018:301900-01-01 10:00:001900-01-01 18:30:00
社員ID                       object
出勤時刻                       object
退勤時刻                       object
出勤時刻_datetime        datetime64[ns]
退勤時刻_datetime        datetime64[ns]
dtype: object

この方法について詳しく知りたい方は、Pandasの公式ドキュメントを参照してみてください。

以上で、Pandasで時刻データを自由自在に操るための解説を終わります。
みなさんのデータ分析ライフが、より充実したものになることを願っています!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内の金融機関で経営企画をしています。
2年でメガバンクを辞めてしまいましたが、むしろ人生が豊かになりました。
データアナリスト的なことをしていたのでPythonとTableauがちょっとだけ使えます。
文系大卒→メガバンク(営業)→広告系ベンチャー(経営企画、FP&A、データアナリスト)→都内金融機関(経営企画)

コメント

コメントする

目次