はじめに #
PandasのTimestampを使った時刻の生成や、時刻オブジェクトからの属性の取得、任意形式の文字列での出力について述べる。
Pandasには時刻を扱うためのTimestampというクラスがある。本記事では、Timestampクラスを用いた時刻オブジェクトの生成方法や、その時刻オブジェクトから年月日などの情報を属性として取得する方法について述べる。また、時刻を文字列として取得する方法などについても述べる。
PandasのTimestampは、Pythonの標準パッケージに含まれるdatetimeモジュールとほぼ同じ機能を持つ。したがって、Pandasをよく使う場合は、時刻もPandasで統一して扱うと、datetime.datetimeオブジェクトと変換したり、datetimeモジュールをインポートしたりする手間を省ける。
以降では、Pandasを以下のようにインストールしていることを前提とする。
import pandas as pd
また、環境は以下の通り。
| バージョン | |
|---|---|
| Python | 3.7.3 |
| Pandas | 0.24.2 |
Timestampクラスについて #
Timestampクラスは、日付や時刻を扱うクラスであり、扱える最小時刻はナノ秒である。 TimestampをDataFrame配列のインデックスにすることにより、時刻データを柔軟に扱うことができる。
また、Timestampオブジェクト同士の差をとると、Timedeltaという時間の長さを表すオブジェクトが生成されるが、本記事では扱わない。 さらに、Timestampクラスはタイムゾーン(時差の情報)を持つことができるが、これも扱わない。
時刻(Timestampオブジェクト)の生成 #
pd.Timestampオブジェクトを作成する方法はいくつかあるが、ここでは、pd.Timestampクラスから直接作成する以下3つの方法を示す。
- 日付の文字列から生成
- UNIX時刻からの生成
- 現在時刻から生成
また、pd.date_range()関数を使って、連続した時刻を生成する方法についても述べる。
日付の文字列から生成 #
Timestampに時刻を表す文字列を渡すと、時刻オブジェクトが生成される。時刻を表す文字列は柔軟に解釈されるため、年・月・日などの区切りに-や/などが入っていても問題ない。
>>> pd.Timestamp("20200103")
Timestamp('2020-01-03 00:00:00')
>>> pd.Timestamp("2020-01-03")
Timestamp('2020-01-03 00:00:00')
>>> pd.Timestamp("2020/01/03")
Timestamp('2020-01-03 00:00:00')
また、ナノ秒単位まで扱える(ナノ秒未満を指定すると切り捨てられる)。
>>> pd.Timestamp("2020-01-03 01:23:45.6789012345")
Timestamp('2020-01-03 01:23:45.678901234')
UNIX時刻からの生成 #
TimestampにUNIX時刻を整数または小数で渡すと、時刻オブジェクトが生成される。UNIX時刻とは、1970年1月1日0時0分0秒を起点とした時刻である。
デフォルトでは、UNIX時刻の単位はナノ秒である。これを変更するには、Timestampのunit引数にUNIX時刻の単位を文字列で指定する。有効な単位はD, h, m, s, ms, us, nsである。
>>> pd.Timestamp(0) ### UNIX時刻の起点
Timestamp('1970-01-01 00:00:00')
>>> pd.Timestamp(1) ### デフォルトでは1ナノ秒に解釈される
Timestamp('1970-01-01 00:00:00.000000001')
>>> pd.Timestamp(1, unit="s") ### 1秒単位に変更
Timestamp('1970-01-01 00:00:01')
現在時刻から生成 #
Timestampのnow()メソッドを実行すると、現在時刻が得られる。
>>> pd.Timestamp.now()
Timestamp('2020-01-03 10:15:49.030441')
連続した時刻の生成 #
一定の間隔で連続した時刻の配列を生成したい場合は、
pd.date_range()関数を用いる。
この関数の主な引数を示す。
pd.date_range(start=None, end=None, periods=None, freq=None)
引数の説明は以下の通り。
| 引数 | データ型 | 説明 |
|---|---|---|
start |
str, pd.Timestamp | 開始時刻 |
end |
str, pd.Timestamp | 終了時刻 |
periods |
int | 時刻の数 |
freq |
str | 時刻の間隔 |
4つの引数 (start, end, periods, freq) の内、3つを指定する必要がある。
また、freqは時間の単位を表す文字列を与える。主な時間の単位と、対応する文字列を示す。
| 時間の単位 | 文字列 |
|---|---|
| 年末 | A, Y |
| 年始 | AS, YS |
| 月末 | M |
| 月始 | MS |
| 日 | D |
| 時間 | H |
| 分 | T, min |
| 秒 | S |
| ミリ秒 | L, ms |
| マイクロ秒 | U, us |
| ナノ秒 | N |
また、文字列の前に数字を付けると、その時間の倍数になる。
例:3分の場合、freq="3T"
また、その他の時間の単位(四半期、営業日など)は以下のリンクを参照。
Time series _ date functionality — pandas 1.2.0 documentation
Timestampの主な属性 #
Timestampオブジェクトの主な属性を示す。 まず、時刻の単位を数字で取り出せる属性を示す(なぜかミリ秒がない)。
| 時間の単位 | 属性名 |
|---|---|
| 年 | year |
| 月 | month |
| 日 | day |
| 時間 | hour |
| 分 | minute |
| 秒 | second |
| マイクロ秒 | microsecond |
| ナノ秒 | nanosecond |
また、その他の属性を以下に示す。
| 説明 | 属性 |
|---|---|
| UNIX時刻(ナノ秒単位) | value |
| 曜日(月曜: 0, …, 日曜: 6) | dayofweek |
| その年の何日目か | dayofyear |
例
>>> t1 = pd.Timestamp("2020-01-03")
>>> t1.year ### 年を取得
2020
>>> t1.value ### UNIX時刻(ナノ秒単位)
1578009600000000000
Timestampの主なメソッド #
Timestampオブジェクトの主なメソッドを示す。
時刻の単位を置換する(replace) #
replaceメソッドで、ミリ秒を除く時刻を置換できる。
Timestamp.replace(year=None, month=None, day=None,
hour=None, minute=None, second=None,
microsecond=None, nanosecond=None)
時刻を文字列で出力する(strftime) #
strftimeメソッドで、任意のフォーマットで時刻を文字列として出力できる。なお、strftimeのfはformatの頭文字である。
主なフォーマットを以下の表に示す。
| 時間の単位 | フォーマット |
|---|---|
| 4桁の西暦 | %Y |
| 下2桁の西暦 | %y |
| 月 | %m |
| 日 | %d |
| 時(24時間制) | %H |
| 分 | %M |
| 秒 | %S |
| マイクロ秒(6桁の0埋め) | %f |
これらのフォーマットは、全て0埋め (0 padding) である。
例
>>> t1 = pd.Timestamp("2020-01-03")
>>> t1.strftime("%Y%m%d")
'20200103'
>>> t1.strftime("%Y/%m/%d")
'2020/01/03'
その他のフォーマットについては、以下のページの表を参照のこと。
datetime — Basic date and time types — Python 3.9.1 documentation