Excel では、ドラッグするだけで連続した日付を簡単に生成できます。Python でも、datetime と timedelta という二つのモジュールを使えば、同じようなことができます。1時間おき、1日おき、1か月おきなど、どの間隔でも可能です。

実はとても簡単です。ただ、頭が固まってしまって、こういう方法を思いつかないこともあります。timedelta をループと組み合わせると、一連の日時文字列を生成して配列に保存できます。以下の例では、5秒間隔の時刻の配列を生成しています:

import datetime

dt = datetime.datetime(2010, 12, 1,)
end = datetime.datetime(2010, 12, 30)
step = datetime.timedelta(days=1)

result = []

while dt < end:
  result.append(dt.strftime('%Y-%m-%d %H:%M:%S'))
  dt += step

print(result)

もちろん、リスト内包表記で書き直して処理を速くすることもできますし、場合によってはジェネレーターを使うこともできます。

import datetime as dt

print([dt.date(2017,1,1)+dt.timedelta(days=i) for i in range(30)])

ただ、最も便利な方法といえば、Pandas が提供する date_range 関数です。時系列を生成するジェネレーターを関数としてまとめてくれるので、パフォーマンスが良く、メモリも節約できます。ループで生成すると、範囲が大きいときに時間がかかってしまいますが、それと違って効率的です。では、例を見てみましょう:

# 2017/1/1 から、日単位で 100 件の項目を生成

import pandas as pd

result = pd.date_range('2017/1/1 10:00:00', periods=100, freq='D')

print(result.tolist())
print(result[0:5].to_pydatetime())

for dt in result:
  print(dt.to_pydatetime())

freq には D 以外の値も指定できます。例えば、H は時間、M は月を表します。その他は下の表を参照してください:

AliasDescription
B営業日頻度
Cカスタム営業日頻度(実験的)
Dカレンダー日頻度
W週次頻度
M月末頻度
SM半月末頻度(15日と月末)
BM営業月末頻度
CBMカスタム営業月末頻度
MS月初頻度
SMS半月初頻度(1日と15日)
BMS営業月初頻度
CBMSカスタム営業月初頻度
Q四半期末頻度
BQ営業四半期末頻度
QS四半期初頻度
BQS営業四半期初頻度
A年末頻度
BA営業年末頻度
AS年初頻度
BAS営業年初頻度
BH営業時間頻度
H時間頻度
T, min分頻度
S秒頻度
L, msミリ秒
U, usマイクロ秒
Nナノ秒