日時の取得・処理
Pythonで日時(日付と時刻)を取得、処理する(変更する、比較する)方法を説明します。いくつかある方法のうち、ここではdatetimeというモジュールを使います。モジュールというのは、いくつかの機能をひとまとめにした集合体のことです。datetimeは、日時を処理する機能をひとまとめにしたものです。以下のような行をプログラムの先頭に書いて、datetimeを使えるようにします。
from datetime import datetime
現在の日時を取得する
現在の日時を取得するにはdatetime.now()を使います。
dt = datetime.now()
print(dt)
datetime.now()は、現在の日時を表すデータを返します。上の例ではこのデータをdtという変数(variable)に入れています。それをprint()で表示すると、以下のような出力となります。
2022-06-08 14:27:38.719089
年、月、日がハイフンでつながったものが最初に表示され、それに続いて時刻が表示されます。14:27:38の部分は14時27分38秒を表しています。最後の.719089はマイクロ秒で、14時27分38秒と14時27分39秒の間をマイクロ秒単位で測ったものです。ちなみにミリ秒は1秒の千分の1(1/1000 秒)、マイクロ秒は1秒の百万分の1(1/1000000 秒)です。
年からマイクロ秒まで全てを見るのではなく、その一部だけを取得したい場合には以下のようにします。
dt = datetime.now()
print(dt.year)
print(dt.month)
print(dt.day)
print(dt.hour)
print(dt.minute)
print(dt.second)
print(dt.microsecond)
今日の曜日を取得するには、以下のようにします。
dt = datetime.now()
print(dt.weekday())
weekday()は、0以上6以下の整数値を返し、0が月曜、1が火曜、2が水曜。。。という意味づけになっています。この整数値を、曜日を示す文字に変換するには以下のようにします。
daysOfWeek = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
dt = datetime.now()
dow = daysOfWeek[dt.weekday()]
print("Day of week: " + dow)
daysOfWeekは、曜日を示す文字(”Mon”、”Tue”、”Wed”…)を並べたリストです。リストについてはこのページを参照ください。
上記で述べたことをまとめたサンプルプログラムが、current-time.pyです。
日時を比較する
次に、ある日時と別の日時を比較する方法を説明します。datetime-comparison.pyを見てください。まず以下のようにして、特定の日時(2029年7月22日11時00分)を設定しています。
dt =datetime(year=2029, month=7, day=22, hour=11, minute=0)
このとき、時刻(hourとminute)は省略可能です。その場合は、デフォルトの時刻として0時0分が使われます。
次に、現在の日時を取得しています。
now = datetime.now()
そして、この2つの日時(dtとnow)を比較します。以下のように大小の記号を使えます。
dt > now
ここでは、dtがnowより大きい(将来の日時)かどうかを調べています。以下は、dtがnowより小さい(過去の日時)かどうかを調べています。
dt > now
大小の記号以外に、イコール(=)、以上(>=)、以下(<=)の記号も使えます。
この2つの日時(dt
とnow
)の時間差を調べるには、日時の引き算をします。時間差は秒数で表されており、それを取得するには以下のようにします。
timeDiff = dt - now
print(timeDiff.total_seconds(), "seconds in total")
時間差が大きい場合(複数日になるような場合)は、timeDiff.days
やtimeDiff.seconds
として、日数と、残りの秒数を取得できます。これにより、「◯日□秒」という表示ができるようになります。
print(timeDiff.days, "days and", timeDiff.seconds, "seconds")
```python
yrs = timeDiff.days // 365
days = timeDiff.days % 365
「//」は、割り算の商を得るための記号、「%」は割り算の余りを得るための記号です。例えば、12 // 10 = 1
、12 % 10 = 2
になります(12を10で割ると、答えば1あまり2になるので)。上のコードでyrs
が「△年◯日」の△の数字になり、days
が◯の数字になります。
また、timeDiff.seconds
で取得した「時間差の秒数」が大きい場合、「X時間□秒」という表記にしたいことがあります。その場合には、自分で「X時間」と「□秒」の部分を計算する必要があります。そのために以下の計算をします。
mins = timeDiff.seconds // 60
secs = timeDiff.seconds % 60
hrs = mins // 60
mins2 = mins % 60
### 日時を移動させる(調節する)
### タイムゾーン別の日時を取得する
datetime.now()が返す日時は、ラズパイに設定されている(デフォルトの)タイムゾーンに基づいています。このデフォルトのタイムゾーンは、ラズパイOSをインストールするときに設定したものです。何がデフォルトのタイムゾーンに設定されているかを調べるには、Raspberry Pi Configruation(ラズパイ画面左上のラズベリーアイコンをクリックし、Preferences -> Raspberry Pi Configruationを選択)で「Localisation」をクリックし、続いて「Timezone」をクリックしてください。ボストン周辺でラズパイOSをインストールしたのであれば、以下の写真のようになっているはずです。これはアメリカ東部標準時(EST: Eastern Standard Time)がデフォルトのタイムゾーンになっているということです。
<img src = "images/locale.jpg" width="400">
datetime.now()を使うときに、デフォルトではない別のタイムゾーンでの日時を取得することもできます。これを簡単にやるには、datetimeに加えて[pytz](https://pypi.org/project/pytz/)というモジュールを使うのがおすすめです。pytzを使うと、[tz database](https://en.wikipedia.org/wiki/Tz_database)という国際的なタイムゾーン表記集に基づいてタイムゾーンを指定できるようになります。
ラズパイにpytzがすでにインストールされている場合と、されていない場合がありえます。もしpytzを使おうとして
`ModuleNotFoundError: No module named 'pytz'`
というようなエラーが出たら、pytzがインストールされていないということです。その場合は、このページの最後のセクションを参考にインストールしてください。-->
<!-- サマータイム、daylight saving time、うるう年 -->
pytzを使うには、プログラム先頭部分に以下の一文を加えます。
```Python
import pytz
そして、次のようにタイムゾーンを指定して日時を取得します。
est = pytz.timezone("US/Eastern")
dt = datetime.now(est)
タイムゾーンを指定するにはpytz.timezone()を使います。ここでは”US/Eastern”をpytz.timezone()に渡しているので、アメリカ東部標準時(EST: Eastern Standard Time)を指定しています。タイムゾーンに関する情報が変数estに入り、それをdatetime.now()に渡すことで、ESTでの現在の日時が返されます。上記の2行のプログラムを1行でまとめると次のようになります。2行で書いても1行で書いてもプログラムの実行結果は同じです。自分にとって見やすい(理解しやすい)方を使ってください。
dtEst = datetime.now( pytz.timezone("US/Eastern") )
pytz.timezone()に渡すタイムゾーン(たとえば”US/Eastern”)は、tz databaseの表記法にしたがいます。利用できるタイムゾーン表記一覧はここにまとまっています(「TZ database name」というところを参照)。アメリカの代表的な7つの標準時は以下のように表記します。
標準時の一般的な名称 | pytzで使うタイムゾーン表記 |
---|---|
東部標準時(EST) | “US/Eastern” |
中部標準時(CST) | “US/Central” |
山岳部標準時(MST) | “US/Arizona” |
山岳部夏時間(MDT) | “US/Mountain” |
太平洋標準時(PST) | “US/Pacific” |
アラスカ標準時(AKST) | “US/Alaska” |
ハワイ・アリューシャン標準時(HAST) | “US/Hawaii” |
また、日本標準時(Japan Standard Time: JST)は”Japan”と表記します。ここまでのことをまとめたサンプルプログラムが、current-time-tz.pyです。
なお、全世界共通の標準時である「協定世界時(UTC)」は、pytzでは”UTC”と表記します。UTCは、グリニッジ標準時(Greenwich Mean Time: GMT)と同じ時刻です。pytzで、GMTは”GMT”と表記します。
標準時の一般的な名称 | pytzで使うタイムゾーン表記 |
---|---|
日本標準時(JST) | “Japan” |
協定世界時(UTC) | “UTC” |
グリニッジ標準時(GMT) | “GMT” |
日時をタイムゾーンごとに変換する
あるタイムゾーンでの日時を、別のタイムゾーンでの日時に変換することもできます。次のようにastimezone()を使います。
dtEst = datetime.now( pytz.timezone("US/Eastern") )
dtJst = dtEst.astimezone( pytz.timezone("Japan") )
ここでは、東部標準時での現在の日時を取得し、それを変数dtEstに入れて、その後astimezone()を使って日本標準時へ変換しています。astimezone()に渡すのは、変換先のタイムゾーンです(ここでは日本標準時)。
サンプルプログラムはdt-conversion.pyです。
pytzをインストールする方法
まずは、ラズパイOSを最新の状態にアップデートしてください。Terminalで以下のコマンドを実行します。
sudo apt update -y
次に、以下のコマンドを実行:
sudo apt full-upgrade -y
これで、ラズパイOSが最新の状態にアップデートされました。続いて、以下のコマンドを実行してpytzをインストールしてください。
sudo pip3 install pytz