在 Excel 很簡單的拖曳就可以產生連續的日期們,而在 Python 你可以利用 datetime 和 timedelta 兩個模組做到類似的事情,不管是要間隔一小時、間格一天、間隔一個月都可以做到。

其實蠻簡單的,只是有時腦袋卡住沒想過可以這樣作,用 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)

當然也可以用 List Comprehension 的方式改寫來加快速度,或是視時機用 Generator 來處理。

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
Bbusiness day frequency
Ccustom business day frequency (experimental)
Dcalendar day frequency
Wweekly frequency
Mmonth end frequency
SMsemi-month end frequency (15th and end of month)
BMbusiness month end frequency
CBMcustom business month end frequency
MSmonth start frequency
SMSsemi-month start frequency (1st and 15th)
BMSbusiness month start frequency
CBMScustom business month start frequency
Qquarter end frequency
BQbusiness quarter endfrequency
QSquarter start frequency
BQSbusiness quarter start frequency
Ayear end frequency
BAbusiness year end frequency
ASyear start frequency
BASbusiness year start frequency
BHbusiness hour frequency
Hhourly frequency
T, minminutely frequency
Ssecondly frequency
L, msmilliseconds
U, usmicroseconds
Nnanoseconds