Python で文字列を日時データに変換,時分秒の切り捨て,日時の比較,日時データの数え上げ

概要

本記事では,Python を用いて文字列を日時データ(datetime.datetime 型)に変換する方法,時分秒の切り捨て,日時の比較,および日時データの数え上げについて解説する。Windows のパソコンでの実行を前提とする。

具体的には,以下の処理を扱う。

タイムゾーン情報(+09:00 等)を含む日時文字列の扱いを前提とし,datetime モジュールの strptime/strftime による変換,timestamp() による数値演算,timedelta による日時計算,および pandas DataFrame との連携を実例とともに示す。なお,書式コード %z がコロンを含むオフセット(+09:00)を解析できるのは Python 3.7 以降であり(本記事は Python 3.12 を前提とするため問題なく動作する),%m%dstrptime で 1 桁の月日(例:2020-7-1)も受け付ける。

目次

関連する外部ページ

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:インストーラーによるインストール

  1. Python公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンからWindows用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「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 プログラムを解釈・実行するソフトウェア)を選択する必要がある.

  1. コマンドパレット(コマンド名で機能を呼び出す VS Code の入力欄)を開く(Ctrl+Shift+P
  2. Python: Select Interpreter と入力する
  3. 表示される一覧から,使用する Python(例:C:\Program Files\Python312\python.exe)を選択する.

Python プログラム実行手順

[Windows での Python プログラム実行手順を見るには、ここをクリック]

Windows での Python 実行手順(Visual Studio Codeを使用)

プログラムファイルの作成と保存

  1. 左サイドバーの「エクスプローラー」アイコン(Ctrl+Shift+E)をクリックする
  2. 「NO FOLDER OPENED」(作業対象フォルダが未選択の状態)と表示される場合は,「Open Folder」をクリックし,プログラムを保存するフォルダを選択する

    続いて「フォルダを信用するか」を確認する画面(フォルダ内のコードを実行してよいか確認する VS Code の仕組み)が表示されるので,チェックして Yes を選択する

  3. フォルダ名の右側に表示される「新しいファイル」アイコンをクリックする
  4. ファイル名(例:aitask.py.ファイル名は何でも良い)を入力し Enter を押す.拡張子は .py(Python ファイルを示す拡張子)とする
  5. 実行したいコードを選択し,Ctrl+C でコピーする.VS Code のエディタ領域に Ctrl+V で貼り付ける
  6. Ctrl+S で保存する

プログラムの実行

  1. エディタ右上の三角形「▷」アイコン(Run Python File:現在開いている Python ファイルを実行するボタン)をクリックする.または,エディタ上で右クリックし「ターミナルで Python ファイルを実行」を選択する
  2. VS Code 下部のターミナル(コマンドの入出力を表示する画面)に,実行結果(print 関数の出力等)が表示される
  3. tkinter(Python 標準の GUI ライブラリ)のファイル選択ダイアログを使うプログラムを実行した場合は,ダイアログが開くので対象画像を選択する
  4. 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:002020年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章 まとめ