日時

時間計測には timeit モジュールまたは IPython の %timeit 機能が便利:

In [ ]: %timeit x = 0; x = x + 1
29.7 ns ± 0.049 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [ ]: %timeit x = 0; x += 1
31.9 ns ± 0.0136 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

(あれ,x += 1 より x = x + 1 の方が若干速いんだ。)

ちなみに %%timeit とすると複数行の計測ができる。終了は空行を二つほど打つ:

In [ ]: %%timeit
   ...: x = 0
   ...: x += 1
   ...: 
   ...: 
31.8 ns ± 0.0191 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit の代わりに %time とすれば1回の時間を計測できる。

time.time() は現在時刻を1970年からの秒数で返す(float 型):

import time

t1 = time.time()
time.sleep(1)
t2 = time.time()
print(t2 - t1)

年月日時分秒で表した時刻:

time.localtime() # 現在時刻
time.localtime(t1)  # 1970年頭からの秒数t1の時刻
time.strftime('%Y-%m-%d %H:%M:%S %Z', time.localtime()) # 'YYYY-MM-DD HH:MM:SS JST'
time.strftime('%Y-%m-%d %H:%M:%S %Z', time.gmtime())    # 'YYYY-MM-DD HH:MM:SS UTC'

datetime.datetime 型は,年月日時分秒マイクロ秒を持つ構造体である:

import datetime

datetime.datetime.now()  # datetime.datetime(年, 月, 日, 時, 分, 秒, μ秒)
datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 'YYYY-MM-DD HH:MM:SS'
f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S}' # 上と同じ

x = datetime.datetime.now()
# しばらく経って・・・
y = datetime.datetime.now()
y - x     # datetime.timedelta(seconds=秒, microseconds=μ秒)

例えば2019年5月1日で始まる32日分の配列:

import numpy as np
import matplotlib.pyplot as plt

t = [datetime.datetime(2019,5,1) + datetime.timedelta(days=i) for i in range(32)]
rng = np.random.default_rng()
x = np.cumsum(rng.standard_normal(32))
plt.plot(t, x)

これでは見にくいので,少し工夫:

import matplotlib.dates as mdates

ax = plt.subplot(1,1,1)
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
ax.plot(t, x)

NumPy の datetime64 は最も柔軟な日時型である。年(Y),月(M),週(W),日(D),時(h),分(m),秒(s),ミリ秒(ms)などの単位で64ビット整数で表したものである。日時の起点は1970年1月1日頭である。タイムゾーンは考えない。一番大きい単位 Y を使った datetime64[Y] 型は ±9.2×1018 年まで表せる(宇宙の年齢は 1.38×1010 年ほど)。

import numpy as np

np.datetime64("2019")  # np.datetime64("2019", "Y") と同じ
np.datetime64("2019-05")  # np.datetime64("2019-05", "M") と同じ
np.datetime64("2019-05-01")  # np.datetime64("2019-05-01", "D") と同じ
np.datetime64("2019-05-01 12:34:56")  # np.datetime64("2019-05-01 12:34:56", "s") と同じ

日時の差は timedelta64() で表す:

t = np.array([np.datetime64("2019-05-01") + np.timedelta64(i,"D") for i in range(32)])

これは次のようにも書ける:

t = np.arange(np.datetime64("2019-05-01"), np.datetime64("2019-06-02"))

pandas の Timestamp は NumPy の datetime64[ns](ナノ秒単位)に限定しているので,1677年から2262年くらいまでしか扱えない(データの読み書き参照)。

import pandas as pd

t = pd.to_datetime("2020-05-06")
t = pd.to_datetime("2020年5月6日", format='%Y年%m月%d日')  # 上と同じ
t                      #==> Timestamp('2020-05-06 00:00:00')
t.to_numpy()           #==> numpy.datetime64('2020-05-06T00:00:00.000000000')
t.to_pydatetime()      #==> datetime.datetime(2020, 5, 6, 0, 0)
t.timestamp()          #==> 1588723200.0  # seconds since Epoch
t.value                #==> 1588723200000000000  # ns since Epoch
t.strftime("%Y-%m-%d") #==> '2020-05-06'
t.year                 #==> 2020
t.month                #==> 5
t.day                  #==> 6
t.dayofweek            #==> 2  # 水曜日

format の形式については strftime() and strptime() Format Codes 参照。


Last modified: