Python Generate Datetime Series

在 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 是月份,或參考下表:

Alias Description
B business day frequency
C custom business day frequency (experimental)
D calendar day frequency
W weekly frequency
M month end frequency
SM semi-month end frequency (15th and end of month)
BM business month end frequency
CBM custom business month end frequency
MS month start frequency
SMS semi-month start frequency (1st and 15th)
BMS business month start frequency
CBMS custom business month start frequency
Q quarter end frequency
BQ business quarter endfrequency
QS quarter start frequency
BQS business quarter start frequency
A year end frequency
BA business year end frequency
AS year start frequency
BAS business year start frequency
BH business hour frequency
H hourly frequency
T, min minutely frequency
S secondly frequency
L, ms milliseconds
U, us microseconds
N nanoseconds

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料