Python datetime time

Python学習【365日チャレンジ!】101日目のマスターU(@Udemy11)です。

101という数字を見ると思い出すのはやっぱり、【101匹わんちゃん】ですが、かなり前の映画なので、どんな話だったか詳細が思い出せません。

ディズニーの映画で、ダルメシアンが101匹出てくることと、その子犬たちを毛皮にしてしまおうとする魔女みたいな女性が出てくるってことだけは憶えていますが、最後はやっぱりハッピーエンドだったと思います。

ハッピーエンドじゃない映画ってあんまりないですよね。

といってもバッドエンドの映画は現実味があって、色々と考えさせることがあるので、個人的には結構好きだったりします。

ちなみに私が自信をもって、おすすめできるバッドエンドの映画がこちら!

映画 seven セブン

何度観ても映画の中に引き込まれて、最後はなんとも言えない気分になりますが、超おすすめの映画です。

それではさっそく今日もPython学習をはじめましょう!

昨日の復習

昨日は、subprocessモジュールを使ったコマンド操作について学習しました。

subprocess.run()を使って、ターミナルのコマンドを実行しますが、少し注意点もありました。

import subprocess

subprocess.run(['ls', '-al'])

このコードは、ターミナルでls -al(フォルダ内のファイル・フォルダ詳細を表示するコマンド)を実行しますが、次のように書くこともできました

subprocess.run('ls -al', shell=True)

ただ、この場合は、|(パイプ)に続けてファイルなどを削除するrmコマンドを追加してしまうこともできるため、セキュリティーの関係で使用しないほうが良いということでした。

詳しくは昨日の記事をごらんください。

それでは、今日のPython学習をすすめましょう!

datetime.now()

datetimeモジュールは、現在の時間を取得できる標準ライブラリです。

import datetime

now = datetime.datetime.now()
print(now)
print(now.isoformat())
print(now.strftime('%y/%m/%d-%H:%M:%S'))

出力結果

2020-05-21 20:45:59.239749
2020-05-21T20:45:59.239749
20/05/21-20:45:59

datetime.now()関数を使うことで、現在の日時を取得することができます。

isoformat()を加えると、国際標準化機構 (ISO) の定義した形式で表示され、日付と時間の間にTが入りますが、これは、ローカル(つまり日本)のタイムゾーンという意味があるようです。

最後の行のstrftime()は独自のフォーマットで日時を表示する方法で、表示フォーマットについて、Python公式ドキュメントの「strftime()とstrptime()の書式コードをごらんください。

datetime.date.today()

時間はいらないので、今日の日付だけが必要だというときは、date.today()の出番です。

import datetime

today = datetime.date.today()
print(today)
print(today.isoformat())
print(today.strftime('%y/%m/%d'))

出力結果

2020-05-21
2020-05-21
20/05/21

datetime.now()同様に、isoformat()strftime()を使うことができ、今日の日付だけを抽出することができます。

datetime.time

日付の次は、時間ですが、こちらのdatetime.timeは、現在時刻を取得するのではなく、時刻のフォーマットに数値を入れることができます。

import datetime

t = datetime.time(hour=1, munite=2, second=3, microsecond=4)
print(t)

出力結果

01:02:03.000004

現在時刻がdatetime.timeで指定した時間になればなにか動作をさせるということに使えそうです。

datetime.timedelta()

datetime.timedelta()は、日や時間、分、秒を指定することができる関数で、引数に指定した変数を定義して、現在日時から何日後、何日前といった日時を取得することができます。

import datetime

now = datetime.datetime.now()
d = datetime.timedelta(days=1,hours=1, minutes=1, seconds=1, microseconds=1)
print(now)
print(now + d)

出力結果

2020-05-21 21:27:23.800559
2020-05-22 22:28:24.800560

4行目で、1日、1時間、1分、1秒、1マイクロ秒を変数dに代入して、6行目で現在の日時に変数dを足しているので、変数dに代入した分だけ進んだ日時が表示されます。

このtimedelta()の引数には年と月は用意されていなくて、weeksからしか用意されいません。

これは、うるう年が関係しているようで、正確に日時を指定するには、日数が変わることのない週までしか指定できないみたいです。

time.sleep()

先に学習したdatetimeモジュールのdatetime.timeとは違い、timeモジュールは、日時に関係なく、時間を操作するモジュールです。

よく使うのは、time.sleep()関数で、引数に数値を指定することで、指定した秒数だけ作業を止めておくことができます。

import time

print('start')
time.sleep(10)
print('stop')

このコードを実行すると、まずstartが出力されて、10秒経過してからstopが出力されます。

使い所としては、クイズアプリなどで10秒以内に回答しなければ不正解を出すという場面などで使われてそうですね。

バックアップファイルに日時を入れる

datetimeモジュールの代表的な使い方としては、バックアップファイルを作成するときに、日時をファイル名に付与するというやり方が考えられます。

import os
import shutil
import datetime

f_name = 'test.txt'
now = datetime.datetime.now()

if os.path.exists(f_name):
    shutil.copy(f_name, '{}_{}'.format(now.strftime('%y%m%d-%H%M%S'), f_name))

このコードを実行すると、Pythonファイルと同じ階層にtest.txtファイルが存在した場合、200521-215328-test.txtというもとのファイルに現在の日時を付け足した名前のファイルが作成されます。

この使い方から考えると、WordPressのバックアップをとるプラグインなどで使われてそうな感じがします。

いろいろなアプリで現在日時を取得することはあるかと思うので、datetimeモジュールは、非常に使用頻度の高いモジュールであると言えるでしょう。

入門編が終了

酒井さんの講座は、これで入門編が終了して、いよいよ実践編に入っていきます。

もちろん、もっとたくさんのライブラリやファイルの操作があるわけですが、基本的なことは一通り学習したと考えてもいいでしょう。

これからはどんどん実践して、わからないことは公式ドキュメントやWebで調べながら、自分で解決していくことが求められます。

ここまでは、例示されているコードを観て学習するだけのいわゆる写経的な学習でしたが、これからは、学習した内容を自分で組み立てながら、コードを組み立てていく学習に入るので、まずは自分で考えてコードを書いて、それをどれだけ見やすいコードにできるかという作業の繰り返しになります。

正解はないので、一度きちんと作動したからと言って、それで完成にするのではなく、より見やすくシンプルなコードが書けるよう頭を使っていこうと思います。

それでは、明日もGood Python!