はじめに
こんにちは!みなさんは、時間データの処理に苦労したことはありませんか?
「勤務時間の計算を自動化したいけど、24時間表記の時刻データをどう扱えばいいのかわからない…」 「時刻データを使って計算したいけど、そのままでは足し算や引き算ができなくて困っている…」
こんな悩みを抱えている方は多いのではないでしょうか。特に、PythonのPandasを使ってデータ分析をしているときに、このような問題に直面することがよくあります。
そこで今回は、Pandasで24時間表記の時刻文字列を10進数の数値(時間単位)に変換し、計算可能な形式にする方法を、初心者の方にもわかりやすく丁寧に解説していきます!
この記事で学べること
この記事を読めば、以下のようなことができるようになります。
- 24時間表記の時刻文字列(例:
"15:30"
)を、時間単位の10進数(例:15.5
)に変換する - 変換した数値を使って、勤務時間の計算や時刻間の差分の算出などができるようになる
- 時刻データを扱う際の、文字列と数値の違いを理解する
- 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 | 出勤時刻 | 退勤時刻 |
---|---|---|
A001 | 9:00 | 18:00 |
A002 | 9:30 | 19:00 |
A003 | 10:00 | 18: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 | 出勤時刻 | 退勤時刻 | 出勤時 | 出勤分 | 退勤時 | 退勤分 |
---|---|---|---|---|---|---|
A001 | 9:00 | 18:00 | 9 | 0 | 18 | 0 |
A002 | 9:30 | 19:00 | 9 | 30 | 19 | 0 |
A003 | 10:00 | 18:30 | 10 | 0 | 18 | 30 |
str.split(':')
で、各時刻文字列を:
で分割します。expand=True
を指定することで、分割した結果を別々の列に展開しています。.astype(int)
で分割した文字列を整数(int型)に変換しています。
ステップ2: 分を時間単位に変換
次に、「分」を時間単位に変換します。1時間は60分なので、分の値を60で割ります。
# '出勤分'と'退勤分'を時間単位に変換
df['出勤分'] = df['出勤分'] / 60
df['退勤分'] = df['退勤分'] / 60
社員ID | 出勤時刻 | 退勤時刻 | 出勤時 | 出勤分 | 退勤時 | 退勤分 |
---|---|---|---|---|---|---|
A001 | 9:00 | 18:00 | 9 | 0.0 | 18 | 0.0 |
A002 | 9:30 | 19:00 | 9 | 0.5 | 19 | 0.0 |
A003 | 10:00 | 18:30 | 10 | 0.0 | 18 | 0.5 |
ステップ3: 時と分を合計して10進数にする
最後に、「時」と、時間単位に変換した「分」を合計します。
# '出勤時'と'出勤分'を合計して10進数の時刻を作成
df['出勤時刻_10進数'] = df['出勤時'] + df['出勤分']
df['退勤時刻_10進数'] = df['退勤時'] + df['退勤分']
社員ID | 出勤時刻 | 退勤時刻 | 出勤時 | 出勤分 | 退勤時 | 退勤分 | 出勤時刻_10進数 | 退勤時刻_10進数 |
---|---|---|---|---|---|---|---|---|
A001 | 9:00 | 18:00 | 9 | 0.0 | 18 | 0.0 | 9.0 | 18.0 |
A002 | 9:30 | 19:00 | 9 | 0.5 | 19 | 0.0 | 9.5 | 19.0 |
A003 | 10:00 | 18:30 | 10 | 0.0 | 18 | 0.5 | 10.0 | 18.5 |
これで、"HH:MM"
形式の時刻文字列が、時間単位の10進数(HH.hh
形式)に変換されました!
変換した数値を使って計算する
10進数に変換することで、時刻データを使った計算が簡単にできるようになります。
例えば、各社員の勤務時間を計算するには、以下のように「退勤時刻_10進数」から「出勤時刻_10進数」を引くだけです。
# 勤務時間を計算
df['勤務時間'] = df['退勤時刻_10進数'] - df['出勤時刻_10進数']
社員ID | 出勤時刻 | 退勤時刻 | 出勤時 | 出勤分 | 退勤時 | 退勤分 | 出勤時刻_10進数 | 退勤時刻_10進数 | 勤務時間 |
---|---|---|---|---|---|---|---|---|---|
A001 | 9:00 | 18:00 | 9 | 0.0 | 18 | 0.0 | 9.0 | 18.0 | 9.0 |
A002 | 9:30 | 19:00 | 9 | 0.5 | 19 | 0.0 | 9.5 | 19.0 | 9.5 |
A003 | 10:00 | 18:30 | 10 | 0.0 | 18 | 0.5 | 10.0 | 18.5 | 8.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進数 |
---|---|---|---|---|
A001 | 9:00 | 18:00 | 9.0 | 18.0 |
A002 | 9:30 | 19:00 | 9.5 | 19.0 |
A003 | 10:00 | 18:30 | 10.0 | 18.5 |
lambda x:
は無名関数(その場で使い捨ての関数)を定義しています。apply()
は、データフレームの各要素(ここでは各行の’出勤時刻’の値)に関数を適用します。
コードが簡潔になり、処理も高速です。
応用例:時刻データの集計
変換した数値データを使えば、様々な集計処理も簡単にできます。
例えば、以下のようなことができます。
- 社員ごとの平均勤務時間を計算する
- 部署ごとの総勤務時間を計算する
- 特定の時間帯の勤務回数をカウントする
これらの処理も、数値データに変換することで、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 |
---|---|---|---|---|
A001 | 9:00 | 18:00 | 1900-01-01 09:00:00 | 1900-01-01 18:00:00 |
A002 | 9:30 | 19:00 | 1900-01-01 09:30:00 | 1900-01-01 19:00:00 |
A003 | 10:00 | 18:30 | 1900-01-01 10:00:00 | 1900-01-01 18:30:00 |
社員ID object
出勤時刻 object
退勤時刻 object
出勤時刻_datetime datetime64[ns]
退勤時刻_datetime datetime64[ns]
dtype: object
この方法について詳しく知りたい方は、Pandasの公式ドキュメントを参照してみてください。
以上で、Pandasで時刻データを自由自在に操るための解説を終わります。
みなさんのデータ分析ライフが、より充実したものになることを願っています!
コメント