Python で文字列を日時データに変換,時分秒の切り捨て,日時の比較,日時データの数え上げ
【概要】
本記事では,Python を用いて文字列を日時データ(datetime.datetime 型)に変換する方法,時分秒の切り捨て,日時の比較,および日時データの数え上げについて解説する。Windows のパソコンでの実行を前提とする。
具体的には,以下の処理を扱う。
- 文字列を datetime.datetime 型に変換する方法(
strptimeメソッドの使用) - 秒,分,時の切り捨て(その日の 0時 0分の取得,0時 0分からの経過秒数の算出,分の始めからの経過秒数の算出)
- 日時の引き算(指定した秒数だけ前の日時の算出,2つの日時の差を日数で求める方法)
- 日時の比較(基準日時との比較による True/False 判定)
- 日時の数え上げ(pandas の value_counts を使った一定秒数ごとの数え上げ,日付による行の選択)
- datetime.datetime 型を文字列に変換する方法(
strftimeメソッドの使用)
タイムゾーン情報(+09:00 等)を含む日時文字列の扱いを前提とし,datetime モジュールの strptime/strftime による変換,timestamp() による数値演算,timedelta による日時計算,および pandas DataFrame との連携を実例とともに示す。なお,書式コード %z がコロンを含むオフセット(+09:00)を解析できるのは Python 3.7 以降であり(本記事は Python 3.12 を前提とするため問題なく動作する),%m・%d は strptime で 1 桁の月日(例:2020-7-1)も受け付ける。
【目次】
- 第1章 前準備
- 第2章 必要なライブラリのインストール
- 第3章 実行のための準備と確認手順(Windows 前提)
- 第4章 概要・使い方・実行上の注意
- 第5章 演習1 文字列を datetime.datetime 型に変換
- 第6章 演習2 その日の 0時 0分の取得
- 第7章 演習3 その日の 0時 0分からの経過秒数
- 第8章 演習4 分の始めからの経過秒数
- 第9章 演習5 指定した秒数だけ前の日時
- 第10章 演習6 2つの日時の差を日数で求める
- 第11章 演習7 日時の比較
- 第12章 演習8 300秒ごとの数え上げ
- 第13章 演習9 日付による行の選択
- 第14章 演習10 datetime.datetime 型を文字列に変換
- 第15章 まとめ
【関連する外部ページ】
Python 公式の datetime モジュールのドキュメント,pandas 公式の value_counts のドキュメントを参照のこと。
【サイト内の関連情報】
第1章 前準備
Python 3.12 のインストール
Pythonのインストールを行い、Pythonのプログラムを実行する環境を整える。扱う環境は、Windows搭載パソコンである。金子研究室では、Python 3.12.10を推奨する。
[Windows での Python 3.12 のインストール手順を見るには、ここをクリック]
Windows での Python 3.12 のインストール
以下のいずれかの方法でPython 3.12をインストールする。Pythonがインストール済みの場合、この手順は不要である。
方法 1:winget によるインストール
【インストールコマンドの実行方法】
管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして、コマンド全体をコマンドプロンプトにコピー&ペーストする。
--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動するとPATHが反映される。
REM Python 3.12 をシステム領域にインストール
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and (';'+$c+';' -notlike \"*;$p;*\") -and (';'+$c+';' -notlike \"*;$s;*\")){[Environment]::SetEnvironmentVariable('Path',\"$p;$s;$c\",'Machine')}"
方法 2:インストーラーによるインストール
- Python公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンからWindows用インストーラーをダウンロードする。
- ダウンロードしたインストーラーを実行する。
- 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから
pythonコマンドを実行できない。 - 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。
インストールの確認
コマンドプロンプトで以下を実行する。
python --version
バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。
Python の開発環境 Visual Studio Code のインストールと Python 用の設定
Python の開発環境Visual Studio Code(プログラムを編集するソフトウェア。以下、VS Code)を整える。
[Windows での Visual Studio Code のインストールと Python 用の設定手順を見るには、ここをクリック]
Windows での Visual Studio Code のインストールと Python 用の設定手順
1. VS Code と拡張機能のインストール
以下のコマンドにより,既存の VS Code を削除し,全ユーザー共有の設定で再インストールしたうえで,拡張機能(VS Code に機能を追加するソフトウェア)をまとめて導入する.
【インストールコマンドの実行方法】
管理者権限でコマンドプロンプトを起動する(手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして,コマンド全体をコマンドプロンプトにコピー&ペーストする。
インストールコマンド
REM ============================================================
REM Microsoft Visual Studio Code
REM ============================================================
winget uninstall -e --id Microsoft.VisualStudioCode --silent --disable-interactivity --accept-source-agreements
rmdir /s /q C:\ProgramData\vscode-extensions 2>nul
rmdir /s /q "%APPDATA%\Code" 2>nul
rmdir /s /q "%USERPROFILE%\.vscode" 2>nul
rmdir /s /q "%LOCALAPPDATA%\Microsoft\vscode-update" 2>nul
REM VS Code をシステム領域に新規インストール
winget install --scope machine --id Microsoft.VisualStudioCode -e --silent --accept-source-agreements --accept-package-agreements
REM 全ユーザー共有の拡張機能フォルダ
mkdir C:\ProgramData\vscode-extensions 2>nul
icacls "C:\ProgramData\vscode-extensions" /grant "Everyone:(OI)(CI)M" /T
REM スタートメニューのショートカットを --extensions-dir 付きで再作成
rmdir /s /q "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code" 2>nul
del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk" 2>nul
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); $lnk.TargetPath='C:\Program Files\Microsoft VS Code\Code.exe'; $lnk.Arguments='--extensions-dir \"C:\ProgramData\vscode-extensions\"'; $lnk.Save()"
REM ショートカットの検証
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); Write-Host 'TargetPath:' $lnk.TargetPath; Write-Host 'Arguments:' $lnk.Arguments"
REM ファイル / フォルダ右クリックの「Code で開く」を登録
reg add "HKLM\SOFTWARE\Classes\*\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\Background\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%V\"" /f
REM --extensions-dir 付きで起動する code.cmd ラッパを作成
REM (%* を echo で書くと対話的 cmd で失われるため、PowerShell で [char]37+'*' を書き出す)
powershell -NoProfile -Command "$pct=[char]37; $q=[char]34; $c='@echo off'+[char]13+[char]10+$q+'C:\Program Files\Microsoft VS Code\bin\code.cmd'+$q+' --extensions-dir '+$q+'C:\ProgramData\vscode-extensions'+$q+' '+$pct+'*'+[char]13+[char]10; [IO.File]::WriteAllText('C:\ProgramData\vscode-extensions\vscode.cmd',$c,[Text.Encoding]::ASCII)"
REM 拡張機能のインストール
set "CODE=C:\Program Files\Microsoft VS Code\bin\code.cmd"
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot-chat
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.python
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.vscode-pylance
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.debugpy
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension MS-CEINTL.vscode-language-pack-ja
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension saoudrizwan.claude-dev
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension rust-lang.rust-analyzer
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension tamasfe.even-better-toml
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension anthropic.claude-code
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension almenon.arepl
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --list-extensions --show-versions
echo === セットアップ完了 ===
2. Python インタプリタの選択
同一マシンに複数の Python がインストールされている場合,VS Code で使用する Python 本体(インタプリタ:Python プログラムを解釈・実行するソフトウェア)を選択する必要がある.
- コマンドパレット(コマンド名で機能を呼び出す VS Code の入力欄)を開く(
Ctrl+Shift+P) Python: Select Interpreterと入力する
- 表示される一覧から,使用する Python(例:
C:\Program Files\Python312\python.exe)を選択する.
Python プログラム実行手順
[Windows での Python プログラム実行手順を見るには、ここをクリック]
Windows での Python 実行手順(Visual Studio Codeを使用)
プログラムファイルの作成と保存
- 左サイドバーの「エクスプローラー」アイコン(
Ctrl+Shift+E)をクリックする
- 「NO FOLDER OPENED」(作業対象フォルダが未選択の状態)と表示される場合は,「Open Folder」をクリックし,プログラムを保存するフォルダを選択する
続いて「フォルダを信用するか」を確認する画面(フォルダ内のコードを実行してよいか確認する VS Code の仕組み)が表示されるので,チェックして Yes を選択する
- フォルダ名の右側に表示される「新しいファイル」アイコンをクリックする
- ファイル名(例:
aitask.py.ファイル名は何でも良い)を入力しEnterを押す.拡張子は.py(Python ファイルを示す拡張子)とする
- 実行したいコードを選択し,
Ctrl+Cでコピーする.VS Code のエディタ領域にCtrl+Vで貼り付ける Ctrl+Sで保存する
プログラムの実行
- エディタ右上の三角形「▷」アイコン(Run Python File:現在開いている Python ファイルを実行するボタン)をクリックする.または,エディタ上で右クリックし「ターミナルで Python ファイルを実行」を選択する
- VS Code 下部のターミナル(コマンドの入出力を表示する画面)に,実行結果(
print関数の出力等)が表示される
- tkinter(Python 標準の GUI ライブラリ)のファイル選択ダイアログを使うプログラムを実行した場合は,ダイアログが開くので対象画像を選択する
- VS Code 下部のターミナルで実行結果を確認する.OpenCV ウィンドウ(OpenCV が画像を表示するために開く専用ウィンドウ)が開いた場合はそちらも確認する.OpenCV ウィンドウは,マウスクリックでウィンドウをアクティブ(操作対象の状態)にしてからキーを押すと終了する
第2章 必要なライブラリのインストール
管理者権限でコマンドプロンプトを起動する
(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。
pip install -U --no-user pandas
本記事のプログラムでは,標準ライブラリの datetime に加え,外部ライブラリの pandas を使用する。datetime は Python に標準で含まれるため,別途インストールは不要である。
第3章 実行のための準備と確認手順(Windows 前提)
3.1 プログラムの準備
各演習のコードをテキストエディタ(Visual Studio Code やメモ帳など)に貼り付けて実行する(文字コード:UTF-8)。本記事には複数の独立したコードが含まれる。各コードは単独で実行できるため,確認したいコードを順に実行する。
3.2 実行コマンド
コマンドプロンプトでコードを保存したディレクトリに移動し,以下を実行する(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)。
cd 保存先ディレクトリ
python a.py
3.3 動作確認チェックリスト
| 確認項目 | 期待される結果 |
|---|---|
| 文字列を datetime.datetime 型に変換するコードの実行 | 変換後の日時 2020-06-30 13:00:00+09:00 とタイムゾーン情報 UTC+09:00 が表示される |
| その日の 0時 0分を取得するコードの実行 | 2020-06-30 00:00:00+09:00 とタイムゾーン情報が表示される |
| 0時 0分からの経過秒数を求めるコードの実行 | 41904.0 が表示される |
| 分の始めからの経過秒数を求めるコードの実行 | 日時と経過秒数 24.0 が表示される |
| 60秒前の日時を求めるコードの実行 | 元の日時と60秒前の日時が表示される |
| 2つの日時の差を日数で求めるコードの実行 | 9 が表示される |
| 日時の比較コードの実行 | basetime 以降の日時に対して True,以前の日時に対して False が表示される |
| 300秒ごとの数え上げコードの実行 | 300秒区間ごとの件数が value_counts の結果として表示される |
| 日付による行選択コードの実行 | 指定した日付と同じ日のデータのみが選択・表示される |
| datetime.datetime 型を文字列に変換するコードの実行 | 2020/06/30 13:00:00 および 2020年06月30日 が表示される |
第4章 概要・使い方・実行上の注意
4.1 文字列を datetime.datetime 型に変換
次のような日時を表す文字列があるとする。
"2017-7-1 11:38:24"
文字列を datetime.datetime 型に変換するには,datetime.strptime メソッドを使用する。書式文字列 %Y-%m-%d %H:%M:%S %z を指定することで,年・月・日・時・分・秒・タイムゾーン(%z はタイムゾーンオフセットを表す)を含む文字列を解析できる。
4.2 秒,分,時の切り捨て
その日の 0時 0分の取得は,datetime.datetime 型の年・月・日のみを使って新たな datetime オブジェクトを生成することで実現する。結果は datetime.datetime 型で得られる。
その日の 0時 0分から何秒経過したかは,timestamp() メソッドで Unix タイムスタンプ(1970年1月1日 0時0分0秒 UTC からの経過秒数)に変換し,その差を算出することで求める。
「分の始め」から何秒経過したかは,秒以下を切り捨てた datetime オブジェクトを生成し,元の日時との timestamp() の差を求めることで算出する。
4.3 日時の引き算
ある日時の 60 秒前を求めるには,timedelta(seconds=delta)(時間の長さを表すオブジェクト)を日時から減算する。
2つの日時の差を日数で求めるには,datetime オブジェクト同士の減算結果(timedelta 型)の days 属性を参照する。実行結果として 9 が表示される。
4.4 日時の比較
グローバル変数 basetime に設定した日時以降であれば True を返す。datetime オブジェクト同士は比較演算子(>,<,== 等)で直接比較できる。
4.5 日時の数え上げ
次のようなデータがあるとする。日時を 300 秒ごとに区切って value_counts を使って数え上げを行う。経過秒数を 300 で整数除算し,再び 300 を乗じることで,300秒単位の区間に丸めている。
"2020-07-1 0:0:0" と同じ日のデータだけを選択するには,compare_by_date 関数を使用する。この関数は,指定した基準日と同じ日付(0時 0分の比較)かどうかを判定するラムダ関数(その場で定義する無名の関数)を返す。
DataFrame に対して日付による選択を行う場合は,map メソッドで compare_by_date を各行に適用し,条件に合致する行を抽出する。
4.6 datetime.datetime 型を文字列に変換
datetime.datetime 型のデータを,指定した書式の文字列に変換するには strftime メソッドを使用する。書式文字列を変更することで,さまざまな形式の文字列を出力できる。実行結果として 2020/06/30 13:00:00 および 2020年06月30日 が表示される。
第5章 演習1 文字列を datetime.datetime 型に変換
演習1のテーマは,文字列を datetime.datetime 型に変換することである。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,変換後の日時とタイムゾーン情報の表示を確認する。
ヒント:strptime の第2引数の書式文字列が,入力文字列の並びと一致している必要がある。
考察ポイント:表示された tzinfo が +09:00 のオフセットを保持していることを読み取る。
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
x = to_datetime("2020-06-30 13:00:00 +09:00")
print(x)
print(x.tzinfo)
第6章 演習2 その日の 0時 0分の取得
演習2のテーマは,その日の 0時 0分を取得することである。結果は datetime.datetime 型で得られる。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,0時 0分の日時とタイムゾーン情報の表示を確認する。
ヒント:年・月・日のみを使って新たな datetime オブジェクトを生成している。
考察ポイント:時・分・秒が 0 に置き換わり,タイムゾーン情報が引き継がれていることを読み取る。
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
# その日の 0時 0分。パラメータは datetime.datetime 型
def first_of_day(x):
return dt(x.year, x.month, x.day, tzinfo=x.tzinfo)
x = to_datetime("2020-06-30 13:00:00 +09:00")
print(first_of_day(x))
print(first_of_day(x).tzinfo)
第7章 演習3 その日の 0時 0分からの経過秒数
演習3のテーマは,その日の 0時 0分から何秒経過したかを求めることである。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,経過秒数の表示を確認する。
ヒント:timestamp() で Unix タイムスタンプに変換し,その差を取っている。
考察ポイント:41904.0 が,11時38分24秒を秒数に換算した値(11×3600+38×60+24)と一致することを読み取る。
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
# その日の 0時 0分。パラメータは datetime.datetime 型
def first_of_day(x):
return dt(x.year, x.month, x.day, tzinfo=x.tzinfo)
# その日の 0時 0分から何秒経過したか
def elapsed(x):
return x.timestamp() - first_of_day(x).timestamp()
x = to_datetime("2020-7-1 11:38:24 +09:00")
# 41904.0 が表示される
print(elapsed(x))
第8章 演習4 分の始めからの経過秒数
演習4のテーマは,分の始めから何秒経過したかを求めることである。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,日時と経過秒数の表示を確認する。
ヒント:秒以下を切り捨てた datetime オブジェクトとの timestamp() の差を取っている。
考察ポイント:経過秒数 24.0 が,入力の秒の値と一致することを読み取る。
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
# 秒以下を切り捨て。パラメータは datetime.datetime 型
def first_of_minute(x):
return dt(x.year, x.month, x.day, x.hour, x.minute, tzinfo=x.tzinfo)
x = to_datetime("2020-7-1 11:38:24 +09:00")
print(x)
print(x.timestamp() - first_of_minute(x).timestamp())
第9章 演習5 指定した秒数だけ前の日時
演習5のテーマは,ある日時の 60 秒前を求めることである。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,元の日時と60秒前の日時の表示を確認する。
ヒント:timedelta(seconds=delta) を日時から減算している。
考察ポイント:分の値が 1 減り,秒の値が 60 だけ戻ることを読み取る。
from datetime import datetime as dt
from datetime import timedelta
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
# 指定した秒数だけ前の日時を返す
def past_time(x, delta):
return x - timedelta(seconds=delta)
x = to_datetime("2020-7-1 11:38:24 +09:00")
print(x)
print(past_time(x, 60))
第10章 演習6 2つの日時の差を日数で求める
演習6のテーマは,2つの日時の差を日数で求めることである。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,日数の表示を確認する。
ヒント:減算結果(timedelta 型)の days 属性を参照している。
考察ポイント:9 が,7月10日と7月1日の差の日数と一致することを読み取る。
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
# 2つの日時の差を日数で返す
def days_between(a, b):
return (a - b).days
x = to_datetime("2020-7-10 11:38:24 +09:00")
y = to_datetime("2020-7-1 11:38:24 +09:00")
print(days_between(x, y))
第11章 演習7 日時の比較
演習7のテーマは,基準日時との比較による True/False 判定である。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,2つの日時に対する判定結果の表示を確認する。
ヒント:datetime オブジェクト同士は比較演算子で直接比較できる。
考察ポイント:basetime 以降の日時に True,以前の日時に False が返ることを読み取る。
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
basetime = to_datetime("2020-06-30 09:00:00 +09:00")
def time_selection(x):
return x > basetime
x = to_datetime("2020-7-1 11:38:24 +09:00")
print(x)
print(time_selection(x))
y = to_datetime("2020-6-29 11:38:24 +09:00")
print(y)
print(time_selection(y))
第12章 演習8 300秒ごとの数え上げ
演習8のテーマは,日時を 300 秒ごとに区切って value_counts で数え上げることである。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,300秒区間ごとの件数の表示を確認する。
ヒント:経過秒数を 300 で整数除算し,再び 300 を乗じて区間に丸めている。
考察ポイント:各区間に何件のデータが属するかを読み取る。
import pandas as pd
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
m1 = pd.DataFrame([
[1, "2020-7-1 11:38:00 +09:00"],
[2, "2020-7-1 11:38:00 +09:00"],
[4, "2020-7-1 11:39:00 +09:00"],
[5, "2020-7-1 11:40:00 +09:00"],
[6, "2020-7-1 11:40:00 +09:00"],
[7, "2020-7-1 11:40:00 +09:00"]
],
columns=['id', 'datetime'])
# その日の 0時 0分。パラメータは datetime.datetime 型
def first_of_day(x):
return dt(x.year, x.month, x.day, tzinfo=x.tzinfo)
# その日の 0時 0分から何秒経過したか
def elapsed(x):
return x.timestamp() - first_of_day(x).timestamp()
x = (m1.datetime.map(to_datetime).map(elapsed) // 300) * 300
print(x.value_counts(sort=True, ascending=True))
第13章 演習9 日付による行の選択
演習9のテーマは,指定した基準日と同じ日のデータだけを選択することである。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,基準日と同じ日のデータのみが選択されることを確認する。
ヒント:compare_by_date は,0時 0分どうしの比較を行うラムダ関数を返す。
考察ポイント:基準日と同じ日付の行だけが抽出されることを読み取る。
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
# その日の 0時 0分。パラメータは datetime.datetime 型
def first_of_day(x):
return dt(x.year, x.month, x.day, tzinfo=x.tzinfo)
def compare_by_date(base):
return lambda x: first_of_day(to_datetime(x)) == first_of_day(to_datetime(base))
print(compare_by_date("2020-07-1 0:0:0 +09:00")("2020-07-1 10:0:0 +09:00"))
print(compare_by_date("2020-07-1 0:0:0 +09:00")("2020-07-2 10:0:0 +09:00"))
DataFrame に対して日付による選択を行う。
import pandas as pd
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
# その日の 0時 0分。パラメータは datetime.datetime 型
def first_of_day(x):
return dt(x.year, x.month, x.day, tzinfo=x.tzinfo)
def compare_by_date(base):
return lambda x: first_of_day(to_datetime(x)) == first_of_day(to_datetime(base))
m2 = pd.DataFrame([
[1, "2020-7-1 11:38:00 +09:00"],
[2, "2020-7-1 11:38:00 +09:00"],
[4, "2020-7-1 11:39:00 +09:00"],
[5, "2020-7-1 11:40:00 +09:00"],
[6, "2020-7-2 3:10:00 +09:00"],
[7, "2020-7-2 3:10:00 +09:00"]
],
columns=['id', 'datetime'])
print('----')
print(m2[m2.datetime.map(compare_by_date("2020-07-1 0:0:0 +09:00"))])
print('----')
print(m2[m2.datetime.map(compare_by_date("2020-07-2 0:0:0 +09:00"))])
第14章 演習10 datetime.datetime 型を文字列に変換
演習10のテーマは,datetime.datetime 型を任意の書式の文字列に変換することである。
手順:次のコードを実行(メモ帳を用いる場合は a.py のようなファイル名で保存して実行)し,2種類の書式の文字列の表示を確認する。
ヒント:strftime の書式文字列を変えると出力形式が変わる。
考察ポイント:2020/06/30 13:00:00 と 2020年06月30日 が,同じ日時から異なる書式で得られることを読み取る。
from datetime import datetime as dt
# 文字列を datetime.datetime 型に変換
def to_datetime(x):
return dt.strptime(x, "%Y-%m-%d %H:%M:%S %z")
# datetime.datetime 型を文字列に変換
def to_string(x, fmt="%Y/%m/%d %H:%M:%S"):
return x.strftime(fmt)
x = to_datetime("2020-06-30 13:00:00 +09:00")
print(to_string(x))
print(to_string(x, "%Y年%m月%d日"))
第15章 まとめ
- strptime による文字列から datetime.datetime 型への変換:
datetime.strptimeメソッドに書式文字列%Y-%m-%d %H:%M:%S %zを指定することで,タイムゾーン情報を含む日時文字列を datetime.datetime 型に変換できる。 - 時分秒の切り捨てによる日時の丸め:datetime.datetime 型の年・月・日(および必要に応じて時・分)のみを使って新たな datetime オブジェクトを生成することで,その日の 0時 0分や分の始めの時刻を取得できる。
timestamp()の差を求めることで経過秒数も算出できる。 - timedelta を用いた日時の引き算:
timedelta(seconds=delta)を日時から減算することで,指定した秒数だけ前の日時を求められる。また,datetime オブジェクト同士の減算結果(timedelta 型)のdays属性を参照することで,2つの日時の差を日数で求められる。 - datetime オブジェクト同士の比較:datetime オブジェクト同士は比較演算子で直接比較できる。グローバル変数に基準日時を設定し,対象の日時が基準以降かどうかを True/False で判定する方法を示した。
- pandas の value_counts を使った日時の数え上げ:経過秒数を一定の秒数(300秒)で整数除算し再び乗じることで,日時を一定区間に丸めて数え上げを行える。pandas DataFrame の
mapメソッドとvalue_countsを組み合わせることで,日時データの集計ができる。