edo1z blog

プログラミングなどに関するブログです

Pythonで時間関連の関数の勉強(datetime)

地味ですが、Pythonの時間関連の勉強をしたいと思います。
当然いつもやっているのですが、しっかりと頭に叩き込みたいと思います。

下記をやることで頭に叩き込まれると思います。

  • 今日を得る
  • 明日を得る
  • 昨日を得る
  • 1時間前を得る
  • 29時間後を得る
  • 5分前を得る
  • 2011年3月11日からの経過日を得る
  • あと何年で50歳になるかを得る
  • あと年日で50歳になるかを得る
  • あと何時間で50歳になるかを得る
  • 8日後を得る
  • 1ヶ月後を得る
  • 3年2ヶ月3日及び11時間後を得る


さて、まずここを見ながら勉強します。

timedeltaオブジェクト


class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[,weeks]]]]]]])
timedeltaオブジェクトは経過時間、すなわち二つの日付や時刻間の差を表します。


ということなので、時間の計算をしたいときは、このオブジェクトを使うことになるわけでしょう。
試しに、使ってみましょう。

d = datetime.timedelta(days = -1)

こうやると、dは、-1 day, 0:00:00となっています。

d1 = datetime.timedelta(days = 1)
d2 = datetime.timedelta(days = 5)
dd = d2 - d1

こうやると、ddは、4 days, 0:00:00となっています。確かに、計算できていますね。dd.total_seconds()を出してみると、345600.0となります。60秒×60分×24時間×4日ですと、まさしく345600ですね。合っていました。

dateオブジェクト

class datetime.date(year, month, day)
dateオブジェクトは日付 (年、月、および日) を表します。



次はdateオブジェクトで、年月日を表すオブジェクトですね。差分を表すのがtimedeltaですが、こちらはまさに日付を表すものになります。シンプルですね。では、実際使ってみます。

badDay = datetime.date(2011, 3, 11)

とやると、badDayは、2011-03-11となりました。

today = datetime.date.today()

とやると、今日の日付が得られます。2013-02-24となりました。

d = datetime.date.fromordinal(1000000)

こんなのもやってみました。1年1月1日を1とするという変な関数ですね。2といれると、1年1月2日ですし、365と入れると、1年12月31日となります。ちなみに、よく百万年とかいいますが、百万日ということで1000000と入れると、2738-11-28が返ってきます。100万年というのは果てしないことであるのだなと思った次第です。

y = today.year

とやりますと、先程作成したtodayの年のみyに入ります。month、dayも同じ仕組みですね。

ほぼほぼ、整いました。

それでは、宿題を順に解いていきましょう。

■ 今日を得る
これは先程やってしまいました。

■明日を得る

tomorrow = today + datetime.timedelta(days = 1)

とやると、2013-02-25 12:50:48.396328出ました。OKです。

■昨日を得る

yesterday = today - datetime.timedelta(days = 1)

とやると、2013-02-23 12:52:21.310513出ました。OKです。

■1時間前を得る

d = today - datetime.timedelta(hours = 1)

とやると、 2013-02-24 11:55:24.600223でました。タイムゾーンが違うんですけどまあいいでしょう。

■ 29時間後を得る

e = today + datetime.timedelta(hours = 29)

とやると、 2013-02-25 17:57:20.966985出ました。oKそうですね。

■5分前を得る
飽きてきました。

f = today - datetime.timedelta(minutes = 5)

2013-02-24 12:54:06.213152出ました。OKです。

■2011年3月11日からの経過日を得る
今日から引けばいいですね。

g = datetime.datetime(2011,3,11) - today

-717 days, 10:57:36.650128そういえば、today = datetime.datetime.today()としてましたので、全部時間がでてるですね。
ちなみに、date型と、datetime型で計算しようとすると怒られました。

■あと何年で50歳になるかを得る
これは今32歳ですので、今日から18年後を取得するってことでいいですかね。
いやーひととおり、色々やってたんですけど、よく考えたら18年ですね。

■1ヶ月前を得る
もう飽きたので眠いのでこれをやって終わりたいと思います。

i = today - datetime.timedelta(days=30)

2013-01-25 13:15:23.474761

終了です。

体得しました。修行のようでした。