我有包含在YYYY-MM-DD格式的日期兩個字符串變量如下:生成一個給定的範圍內的所有的日期在python
date1 = '2011-05-03'
date2 = '2011-05-10'
我想要寫產生在範圍DATE1所有日期代碼到目前爲止2。這怎麼可以在Python中完成?
我有包含在YYYY-MM-DD格式的日期兩個字符串變量如下:生成一個給定的範圍內的所有的日期在python
date1 = '2011-05-03'
date2 = '2011-05-10'
我想要寫產生在範圍DATE1所有日期代碼到目前爲止2。這怎麼可以在Python中完成?
import datetime
real_date1 = datetime.date(*[int(x) for x in date1.split('-')])
real_date2 = datetime.date(*[int(x) for x in date2.split('-')])
date_range = real_date2 - real_date1
dates = list()
for days in xrange(date_range.days):
dates.append(real_date1 + datetime.timedelta(days))
print dates
import time
def dates_between(start, end):
start_epoch = int(time.mktime(time.strptime(start, "%Y-%m-%d")))
end_epoch = int(time.mktime(time.strptime(end, "%Y-%m-%d"))) + 1 #include end
return range(start_epoch, end_epoch, 86400)
這打破了幾天不是86,400個紀元秒,但我不是Jon Skeet-y足以知道這個假設是否「足夠好」。 – badp 2011-09-26 07:42:05
from dateutil import rrule, parser
date1 = '2011-05-03'
date2 = '2011-05-10'
dates = list(rrule.rrule(rrule.DAILY,
dtstart=parser.parse(date1),
until=parser.parse(date2)))
print dates
由於dateutil是不是一個標準庫,你必須安裝它作爲一個單獨的包。有關格式的更多詳細信息,請參閱文檔(特別是dayfirst
和yearfirst
開關)。
很酷。解析器如何知道它是yyyy-mm-dd還是yyyy-dd-mm? – 2011-05-03 10:38:57
>>> for a in range(9):
... print(datetime.date(2011, 05, 03) + datetime.timedelta(a))
...
2011-05-03
2011-05-04
2011-05-05
2011-05-06
2011-05-07
2011-05-08
2011-05-09
2011-05-10
2011-05-11
我不太確定字符串的解析是整數還是隻是您開始問題的方式。如果是這樣,請忽略答案過於簡化
日期可以像數字一樣相互比較,並且可以使用datetime.timedelta對象進行與日期有關的數學計算。沒有理由在這裏使用dateutil,並且沒有必要硬編碼'範圍(9)'的迭代次數。這與您處理普通舊數字的方式非常相似。
>>> import datetime
>>> date1 = '2011-05-03'
>>> date2 = '2011-05-10'
>>> start = datetime.datetime.strptime(date1, '%Y-%m-%d')
>>> end = datetime.datetime.strptime(date2, '%Y-%m-%d')
>>> step = datetime.timedelta(days=1)
>>> while start <= end:
... print start.date()
... start += step
...
2011-05-03
2011-05-04
2011-05-05
2011-05-06
2011-05-07
2011-05-08
2011-05-09
2011-05-10
>>>
熊貓非常適合時間序列,並且可以直接支持日期範圍和日期解析(它是automagic)。
import pandas as pd
date1 = '2011-05-03'
date2 = '2011-05-10'
mydates = pd.date_range(date1, date2).tolist()
它也有很多選項讓生活更輕鬆。例如,如果您只需要工作日,則只需交換bdate_range
即可。
見http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps
我喜歡這個,因爲它是直觀的,它給了日期字符串數組。
import re
import datetime
def datetime_to_str_date(dt):
return re.sub(r'\T.+$','', dt.isoformat())
start_date = datetime.datetime.strptime('2016-01-01', '%Y-%m-%d')
end_date = datetime.datetime.today()
num_of_days = (end_date - start_date).days
date_list = map(
datetime_to_str_date,
[start_date + datetime.timedelta(days=x) for x in range(0, num_of_days)]
)
假設你的日期已爲datetime.date
類,你可以使用.fromordinal
和.toordinal
創建此oneliner。
from datetime import date
start_date = date(2011, 5, 3)
end_date = date(2011, 5, 10)
[date.fromordinal(i) for i in range(start_date.toordinal(), end_date.toordinal())]
結果是獨家end_date
。使用end_date.toordinal() + 1
的範圍包括end_date
。
重複http://stackoverflow.com/questions/993358/creating-a-range-of-dates-in-python – 2011-05-03 10:29:20
@msa可能,但不是那一個。 – badp 2011-05-03 10:37:44
[在Python中通過一系列日期迭代]的可能的重複(http://stackoverflow.com/questions/1060279/iterating-through-a-range-of-dates-in-python) – kasperd 2015-09-25 13:19:44