在Python中创建日期区间

2 投票
3 回答
957 浏览
提问于 2025-04-15 13:20

我想用一个循环来打印两个日期之间的每一天。其实我打算把这个和一个MySQL查询结合起来,把日期传入查询中,同时也放到输出文件的文件名里。

那么,我该怎么把这个:

sum = 0
for i in range(1,11):
 print sum
 sum += i

改成这样呢?

InputDate = '2009-01-01'
for i in range('2009-01-01','2009-07-01'):
 print InputDate 
 InputDate += i

我知道在rrule里有个功能正好可以做到这一点:

a = date(2009, 1, 1)
b = date(2009, 7, 1)
for dt in rrule(DAILY, dtstart=a, until=b):
 print dt.strftime("%Y-%m-%d")

不过,我现在用的是旧版的Python。

这是我想做的事情的shell脚本版本,希望能帮助你理解:

while [InputDate <= EndDate]
do
    sql="SELECT Date,SUM(CostUsd) FROM DailyStats WHERE Date = '$InputDate' GROUP BY Date"
    name=$(mysql -h -sN -u -p -e "$sql" > DateLoop-$InputDate.txt db)
    echo "$name"
    InputDate=$(( InputDate + 1 ))
done

那么我该怎么在Python中实现呢?

这里补充一个后续问题,方便阅读。不幸的是,我不能使用标准的MySQL库,因为我们有一个专有的设置,多个实例同时运行。运行这种查询的唯一方法是一次连接一个实例,通过命令行。

当 day 小于等于 b 的时候:

打印 "正在提取:" + day

sql="SELECT Date,SUM(CostUsd) FROM Stats d WHERE d.Date = " + day + " GROUP BY Date"

os.system('mysql -h -sN -u -p -e "' + sql + '" > DateLoop-' + day + '.txt db')

day += one_day

3 个回答

2
In [1]: from dateutil.relativedelta import *

In [2]: from datetime import *

In [3]: aday = datetime.today()

In [4]: nextweek = aday+relativedelta(weeks=1)

In [5]: while aday<nextweek:
   ...:     print datetime.strftime(aday,format='%Y-%b-%d')
   ...:     aday+=relativedelta(days=1)
   ...:     
   ...:     
    #Output
2009-Aug-03
2009-Aug-04
2009-Aug-05
2009-Aug-06
2009-Aug-07
2009-Aug-08
2009-Aug-09

虽然你可以用标准库(stdlib)处理大部分关于datetime的事情,但我觉得dateutil可以让你做得更快、更好。

2

试试这个:

import datetime
dt1 = datetime.date(2009, 1, 1)
dt2 = datetime.date(2009, 7, 1)
dt = dt1
while dt <= dt2:
    print dt.strftime("%Y-%m-%d")
    dt += datetime.timedelta(days=1)

你说你只能用旧版本的Python。如果你的Python版本低于2.3,没有datetime模块的话,你也可以这样做:

import time
dt1 = time.mktime(time.strptime('2009-01-01', '%Y-%m-%d'))
dt2 = time.mktime(time.strptime('2009-07-01', '%Y-%m-%d'))
ONE_DAY = 86400
dt = dt1
while dt <= dt2:
    print time.strftime('%Y-%m-%d', time.gmtime(dt))
    dt += ONE_DAY
7

这个代码可以正常运行:

import datetime

a = datetime.date(2009, 1, 1)
b = datetime.date(2009, 7, 1)
one_day = datetime.timedelta(1)

day = a

while day <= b:
    # do important stuff
    day += one_day

撰写回答