よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【Pandas】連続日付データを生成するdate_range()の使い方

今回は、Pandasで日付の連続データを作る方法。

連続する日付の入ったデータフレームを適当に生成したいようなとき、pandas.date_range()を使うと簡単にできます。



【実行環境】

  • Android
  • Termux
  • Python 3.9.6
  • Jupyter Notebook 6.4.0
  • Pandas 1.2.5



目次



pandas.date_range()で連続日付を生成する

引数がいくつかありますが、今回は

  • start
  • end
  • freq
  • periods

を使って連続データを生成する方法を見ていきます。



引数 start=日、freq="d"で日にち、periods=数値、で何日分の連続データかを指定

  • start="初めの日"、'2021/1/1'でも'2021-1-1'でもOK
  • freq="d" で日にちで連続指定(大文字DでもOK)
  • periods=数値 で何日分の連続日付を生成するかを指定
import pandas as pd

# 連続日付の生成
pd.date_range(
    start='2021/1/1',
    freq='d',
    periods=5
)
DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04',
               '2021-01-05'],
              dtype='datetime64[ns]', freq='D')

datetime64型のデータ。

見にくいかな? データフレームでテーブル表示させます。


# 連続日付の生成 データフレーム化
pd.DataFrame(
    pd.date_range(
        start='2021/1/1',
        freq='d',
        periods=5
    )
)
0
0 2021-01-01
1 2021-01-02
2 2021-01-03
3 2021-01-04
4 2021-01-05

start日から、freq="d"で日にちを、periods=5で5つ連続データを生成した。



引数 start日、end日、freq="d" で連続生成

初日と最終日を指定し、freq="d"で日付で連続する。

# 連続日付データを変数に代入
d = pd.date_range(
    start='2021/1/1',
    end='2021/1/8',
    freq='d'
)

d
DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04',
               '2021-01-05', '2021-01-06', '2021-01-07', '2021-01-08'],
              dtype='datetime64[ns]', freq='D')
# type確認
type(d)
pandas.core.indexes.datetimes.DatetimeIndex



引数 start="月-日-年"、freq="3d"、で3日おき連続日の生成

開始日の指定は外国の表示方法のように月・日・年の順番でもできる。またfreq="3d"とかにすると日にちを飛ばした連続日が生成される。

# 3日おき
pd.date_range(
    start="1/5/2021", # 1月5日2021年
    freq="3d",
    periods=5
)
DatetimeIndex(['2021-01-05', '2021-01-08', '2021-01-11', '2021-01-14',
               '2021-01-17'],
              dtype='datetime64[ns]', freq='3D')



引数 start日、freq="y"、periods=数値、で年で連続

start日を元旦に指定しても、生成日付がその年の大晦日からになる。freq="Y"の大文字でも同じ。

# 年で連続
pd.date_range(
    start="2001/1/1",
    freq="y",
    periods=5 #5年
)
DatetimeIndex(['2001-12-31', '2002-12-31', '2003-12-31', '2004-12-31',
               '2005-12-31'],
              dtype='datetime64[ns]', freq='A-DEC')



引数 start日、end日、freq="y"、で連続年

この場合もfreq="y"にすると、その年の大晦日から年ごとの連続日にちが生成される。

pd.date_range(
    start="2010-3-5",
    end="2021-7-27",
    freq="y"
)
DatetimeIndex(['2010-12-31', '2011-12-31', '2012-12-31', '2013-12-31',
               '2014-12-31', '2015-12-31', '2016-12-31', '2017-12-31',
               '2018-12-31', '2019-12-31', '2020-12-31'],
              dtype='datetime64[ns]', freq='A-DEC')



引数 start=日、freq="m"、periods=数値、で連続月末

pd.date_range(
    start="2021/1/5",
    freq="m",
    periods=6
)
DatetimeIndex(['2021-01-31', '2021-02-28', '2021-03-31', '2021-04-30',
               '2021-05-31', '2021-06-30'],
              dtype='datetime64[ns]', freq='M')

freq="m"(大文字Mでも同じ)にすると月末日が連続生成される。



引数 start=日、end=日、freq="m"、で連続月末日

pd.date_range(
    start="2015-2-7",
    end="2015-6-3",
    freq="m"
)
DatetimeIndex(['2015-02-28', '2015-03-31', '2015-04-30', '2015-05-31'], dtype='datetime64[ns]', freq='M')



日付をstart=最近からend=過去、で連続できる?

startとendを逆にすると最近から過去の順で連続データが作られるんだろうか?

pd.date_range(
    start = "2021-7-28",
    end = "2021-7-20",
    freq = "d"
)
DatetimeIndex([], dtype='datetime64[ns]', freq='D')

出来ない。
過去スタートから最近エンドで連続データを作って、並び替えるしかないか。



引数 endだけ指定して連続データが作られるか?

pd.DataFrame(
    pd.date_range(
        end = "2021-7-28",
        freq = "d",
        periods = 5
    )
)
0
0 2021-07-24
1 2021-07-25
2 2021-07-26
3 2021-07-27
4 2021-07-28

これはできた。さかのぼって連続データが生成される。

ここからは応用。



numpy.tile()やnumpy.repeat()で日付データを増幅させる

これらのメソッドには配列を増幅させる機能があります。これを使えば日付データも増やせる。

かんたんな使い方から。

import numpy as np

# np.tile  [1,2,3] → [1,2,3,1,2,3]
print("・元の配列 : ", np.array([1,2,3]))
print("・np.tileで2倍増幅 : ", np.tile([1,2,3], 2)) # 2倍に増幅

# np.repeat [1,2,3] → [1,1,2,2,3,3]
print("・np.repeatで2倍増幅 : ", np.repeat([1,2,3], 2))

・元の配列 :  [1 2 3]
・np.tileで2倍増幅 :  [1 2 3 1 2 3]
・np.repeatで2倍増幅 :  [1 1 2 2 3 3]

これらを日付Seriesデータで使って増幅させてみます。

# 日付Series
data = pd.date_range(start="2021.7.1", freq="d", periods=3)

# 元の日付データ
print("元の日付Seriesデータ")
print(data)
print('-'*20)

# np.tile
print("・np.tileで2倍に増幅")
print(np.tile(data, 2))
print("-"*20)

# np.repeat
print("・np.repeatで2倍に増幅")
print(np.repeat(data, 2))
元の日付Seriesデータ
DatetimeIndex(['2021-07-01', '2021-07-02', '2021-07-03'], dtype='datetime64[ns]', freq='D')
--------------------
・np.tileで2倍に増幅
['2021-07-01T00:00:00.000000000' '2021-07-02T00:00:00.000000000'
 '2021-07-03T00:00:00.000000000' '2021-07-01T00:00:00.000000000'
 '2021-07-02T00:00:00.000000000' '2021-07-03T00:00:00.000000000']
--------------------
・np.repeatで2倍に増幅
DatetimeIndex(['2021-07-01', '2021-07-01', '2021-07-02', '2021-07-02',
               '2021-07-03', '2021-07-03'],
              dtype='datetime64[ns]', freq=None)

ちょっと見にくいのでテーブルにする。

pd.DataFrame(data, columns=['元のデータ'])
元のデータ
0 2021-07-01
1 2021-07-02
2 2021-07-03
pd.DataFrame(np.tile(data,2), columns=["np.tileで2倍"])
             
np.tileで2倍
0 2021-07-01
1 2021-07-02
2 2021-07-03
3 2021-07-01
4 2021-07-02
5 2021-07-03
pd.DataFrame(np.repeat(data, 2), columns=["np.repeatで2倍"])
np.repeatで2倍
0 2021-07-01
1 2021-07-01
2 2021-07-02
3 2021-07-02
4 2021-07-03
5 2021-07-03



date_range()の使用法、ドキュメント、詳細

以下のように書いてセルを実行すると詳しいドキュメントや使い方が表示されます。

# date_range()の使い方、ドキュメント
?pd.date_range

# または
#help(pd.date_range)



以上です。