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 は月を表します。その他は下の表を参照してください:
| Alias | Description |
|---|---|
| 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 | ナノ秒 |