コンサルでデータサイエンティスト

仕事でPythonを書いてます。機械学習、Webマーケティングに興味があります。趣味は旅です。

pandasのTimestampで決まった範囲の時刻リストを作る

Python で日時関連のデータ操作をするときにdatetime モジュールを使用されている方も多いと思いますが、pandasを使ったTimestamp関連の操作が便利なので個人的にはおすすめです。本記事は時刻を含むデータを処理する際に、決まった範囲の時刻リストを作りたいというときに見返すためのメモ記事となります。

時刻リストとは次のようなイメージです。

['2018-12-19 08:00:00+00:00',
 '2018-12-19 08:01:00+00:00',
 '2018-12-19 08:02:00+00:00',
 '2018-12-19 08:03:00+00:00',
 '2018-12-19 08:04:00+00:00']


ある時刻範囲のループをまわして、なにかしらの処理をしたい場合などにご活用ください。

現在の時刻を取得

Python での実装をご紹介します。
まず、次のように現在の時刻を取得します。

$ time = pd.Timestamp.now(tz='GMT').floor(freq='T')



このとき、用途にあわせて時刻のタイムゾーンを指定することができます。

  • 世界標準時(GMT)で設定したい場合: tz='GMT'
  • 日本時刻で設定したい場合: tz=’Asia/Tokyo’

とします。

また .floor を指定することで細かい時刻の端数を丸めることができます。
ここでは、freq=’T’ としているので分単位に丸めています。(ちなみに H が1時間単位、Dが1日単位になります)

このように、GMTタイムゾーンで現在時刻を取得することができました。

$ time
Timestamp('2018-12-19 11:02:00+0000', tz='GMT')


時刻リストの取得

時刻リストを取得します。
今回は、現在の時刻の2分前から、現在の時刻の2分後までの時刻リストを取得したい場合を考えます。

ここではpandasの date_rangeメソッドを使って配列を作っていきます。

$ time_range = pd.date_range(pd.Timestamp(time, tz='GMT') - pd.offsets.Minute(2), pd.Timestamp(time, tz='GMT') + pd.offsets.Minute(2), freq='T')


pandasの date_rangeでは、開始時刻、終了時刻、周期を引数に指定します。
今回は分単位のリストがほしいので freq=’T’ としています。

また時刻の指定においては、pd.offsets を使用して時間単位で分数を足したり引いたりしています。datetimeモジュールなどと比較すると、かなり直感的に時刻を加算・減算することができます。

ちなみにdatetimeモジュールでは下記のように記述する必要がありました。

$ from dateutil.relativedelta import relativedelta
$ dt + relativedelta(minutes=1)



実際に取得したリストをみてみましょう。

$ time_range
 ['2018-12-19 11:00:00+00:00',
  '2018-12-19 11:01:00+00:00',
  '2018-12-19 11:02:00+00:00',
  '2018-12-19 11:03:00+00:00',
  '2018-12-19 11:04:00+00:00']


現在時刻の11:02から前後2分の時刻リストが取得できていることが確認できました。

Timestamp型から UNIX time に変換

pandas の Timestamp型データは簡単にUNIX timeにも変換することができます。
取得したリストを一気に変換したい場合は、リスト内包表記を使って次のように変換可能です。

$ [t.value // 1000000 for t in time_range]
   [1545217200000,
    1545217260000,
    1545217320000,
    1545217380000,
    1545217440000]


まとめ

pandas の Timestamp で時刻リストを作る方法について簡単に紹介しました。特定の時刻範囲のループをまわす処理を書きたいときには、本記事でご紹介したpandasのTimestampを利用してみてはいかがでしょうか。