Pythonで日時データから時間だけの情報を取得したい場面は、データ分析や定例処理などのスケジュール管理で頻繁に発生します。時間情報の取得でよく使われるのが「datetimeモジュール」で、日付情報を取り除いて時刻のみを抽出する処理も簡単です。
この記事では、Python環境において日時のデータから時間部分だけを切り出す基本的な使い方を解説していきます。文字列への変換やPandasを用いた一括処理など、サンプルコード付きで解説していますので、ぜひ参考にしてください。
Pythonのdatetimeから時間だけ取得する方法
Pythonのdatetimeモジュールには、日時データから時刻部分のみを取り出すための手段が複数用意されています。目的に応じて使い分けることによって、時刻データの取得や変換を効率的に行えます。
時間だけを取得する具体的な方法は、以下の4つです。
- timeメソッドでオブジェクトとして抽出する
- strftimeメソッドで文字列として出力する
- Pandasのdt.timeで一括変換する
- datetimeのマイクロ秒部分を切り捨てる
それぞれオブジェクト型での保持や文字列変換、大量データの一括処理など特徴が異なるため、扱うデータの規模や後続処理に応じて適切な手法を選択してください。
timeメソッドでオブジェクトとして抽出する
Pythonの標準ライブラリであるdatetimeモジュールを使用すると、日時データから時刻部分のみを抽出可能です。取得した日時オブジェクトに対して、time()メソッドを呼び出して変換します。
公式ドキュメントでは、このメソッドの挙動を次のように説明しています。
同じhour、minute、second、microsecond 及び foldを持つ time オブジェクトを返します。 tzinfo は None です。
出典:Python公式ドキュメント datetime.datetime.time
この仕様はnaive datetime(タイムゾーン情報を持たないオブジェクト)とaware datetime(タイムゾーン情報を持つオブジェクト)の両方に共通しており、time()メソッドは常にtzinfo=Noneのdatetime.timeオブジェクトを返します。タイムゾーン情報を含めたまま時刻を抽出したい場合は、代わりにtimetz()メソッドを使用してください。
以下のコードは、現在の日時を取得し、そこから時刻のみを抽出する例です。
import datetime
now = datetime.datetime.now()
time_only = now.time()
print(time_only)
print(type(time_only))
上記のコードでは、datetime.now()で取得した値からtime()メソッドで時刻のみを取り出しています。出力結果はdatetime.time型となり、時間のみを管理したい場合に便利です。
時刻情報のみを保持することによって、日跨ぎのスケジュール計算や時間の比較が容易です。営業時間の判定やシフト管理など、日付を問わず時刻だけで比較したい場面で活用できます。
strftimeメソッドで文字列として出力する
日時データから時間を抽出し、任意のフォーマットの文字列として出力したい場合は、strftime()メソッドを使用します。このメソッドを使うと、「時:分:秒」のような任意の形式で時間を表現可能です。
strftimeメソッドを用いた文字列出力の使い方は、以下の通りです。
import datetime
now = datetime.datetime.now()
time_str = now.strftime('%H:%M:%S')
print(time_str)
print(type(time_str))
上記のコードでは、フォーマット指定子である%H(時)、%M(分)、%S(秒)を用いて、時刻部分のみの文字列を生成しています。出力される値の型はstr型です。
ログの出力や画面表示など、プログラム内部の処理ではなく人間が読むためのデータとして扱う際に適しています。
Pandasのdt.timeで一括変換する
データ分析でよく用いられるpandas.Series.dt.timeでは、列全体の日時データから時刻のみを一括で抽出できます。データフレーム内のdatetime64型の列に対して、dt.timeアクセサを利用するという仕組みです。
なお、.dtアクセサはdatetime64型のSeriesにのみ使用できるため、事前にpd.to_datetime()で変換済みの列に対して呼び出す必要があります。
Pandasを用いた時刻データ抽出の使い方は、以下の通りです。
import pandas as pd
date_series = pd.Series(pd.to_datetime(['2023-10-01 12:30:00', '2023-10-02 15:45:00']))
time_series = date_series.dt.time
print(time_series)
上記のコードでは、pd.to_datetime()で変換した日時データに対し、.dt.timeを適用して時刻部分のみを持つSeriesを生成しています。ループ処理を使わずに複数のデータを一度に変換できるのが特徴です。
大量のデータを扱う分析業務においては、この手法によってコードをシンプルに保ちながら一括処理が可能となります。ただし、.dt.timeの戻り値はPythonのdatetime.timeオブジェクトを要素とするSeriesとなるため、その後のNumPyベースのベクトル演算には多くの場合扱いにくい点に留意してください。
datetimeのマイクロ秒部分を切り捨てる
datetime.now()などで現在時刻を取得すると、デフォルトではマイクロ秒(1秒の100万分の1)まで含まれます。マイクロ秒はミリ秒(1秒の1000分の1)とは別の単位であり、標準のdatetimeモジュールはマイクロ秒単位まで対応しています。
なお、datetimeモジュールにmillisecond引数は存在せず、サブ秒精度はmicrosecondのみで指定する仕様です。用途によってはこのマイクロ秒部分が不要となるため、replace()メソッドを使ってゼロに置き換える操作が有効です。
時刻オブジェクトとしてマイクロ秒部分を切り捨てる使い方は、以下の通りです。
import datetime
now = datetime.datetime.now()
time_without_us = now.time().replace(microsecond=0)
print(now.time())
print(time_without_us)
上記のコードでは、time()で時刻オブジェクトを取り出した後、replace(microsecond=0)を呼び出すことでマイクロ秒をゼロにしたdatetime.time型のオブジェクトを生成しています。元のオブジェクト自体は変更されない仕様です。
データベースへの保存やAPIの連携など、秒単位までの精度しか受け付けないシステムにデータを渡す際によく利用されます。
Pythonのdatetimeの時間だけ取得に関するよくある質問
任意の時間だけを持ったオブジェクトを生成できますか?
はい、datetime.timeクラスを使用するか、既存の日時データからtime()メソッドで抽出して生成可能です。datetime.time(12, 30, 0)のように引数に時・分・秒を直接指定することによって、日付情報を持たない任意の時刻オブジェクトを新規に作成できます。
25時のような深夜帯の時刻を変換できますか?
標準のdatetimeモジュールは0〜23時の24時間制のみを扱うため、「25時」のような表記を直接パースすることはできません。実務ではtimedeltaを使って基準日時に時間を加算し、24時間を超えた部分を日数として繰り上げる方法が一般的です。
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
PythonをWebで実行する方法
共通テスト「情報Ⅰ」2年目で変わる、日本の教育と学び方
gitでブランチ(branch)を切り替える方法
git cloneでブランチを指定する方法
64GBのメモリが必要な人・不要な人の特徴
PCを再起動するコマンド一覧
CapsLock以外で大文字になる原因【Windows編】
パソコンで大文字になるのを解除する方法
面白いAIの活用事例を業界別に紹介
Gitでcommit(コミット)を取り消す方法
ITやプログラミングに関するニュース
株式会社HODL1がAI経営管理エージェントを提供開始、少人数での経営管理効率化を支援
株式会社サードスコープがKanataを発表、法人向けAI業務支援SaaSを展開
株式会社ナレッジセンスがChatSenseのPPTX出力機能を強化、資料修正負荷の軽減を支援
株式会社すららネットが「すらら」同時導入を公表、夜間中学で日本語学習と教科学習を支援
DUAL株式会社が空室通電DXと賃貸革命の連携を開始、空室時の通電管理効率化を推進
株式会社ITLINEがAWS生成AIシステム開発・運用を提供開始、企業管理型AI基盤の構築を支援
合同会社ウノマスがAI対応スコアを正式公開、LLMOとSEOの横断診断を支援
Markefan株式会社がmarke.aiを提供開始、BtoBマーケティングの属人化抑制を支援
株式会社FinatextがAIロールプレイング提供開始、金融機関の営業育成基盤構築を支援
株式会社アンドパッドがANDPAD ナレッジAIを提供開始、建設現場の情報検索と共有を支援
