生成要在循环中使用的日期范围

时间:2015-10-27 10:33:14

标签: python

我需要以mm_dd格式生成9月17日至10月18日之间的日期。我所做的是使用2个单独的循环......

第17至30条数据#09_17至09_30

for i in range(17, 31):
    receiver=x.runQuery("copy  dlr_2014_198_bk_todel from 'http://www/sms_sending18.179.67.198_2015_09_"+str(i).zfill(2)+"_utf.csv.gz' CREDENTIALS delimiter '\t' emptyasnull escape gzip")

10月1日至18日数据#10_01至10_18

for i in range(1, 19):
    receiver=x.runQuery("copy  dlr_2014_198_bk_todel from 'http://www/sms_sending18.179.67.198_2015_10_"+str(i).zfill(2)+"_utf.csv.gz' CREDENTIALS delimiter '\t' emptyasnull escape gzip")

是否可以使用单个循环? (日期范围可能是几天或几年)如何以2015_09_17格式动态生成可在for循环中使用的日期?

4 个答案:

答案 0 :(得分:2)

您可以使用datetime和timedelta。循环将开始日期增加一天,直到达到结束日期。

优势:可自动处理可变月份长度。

#!/bin/python
from datetime import datetime, timedelta


start = datetime(2015,9,17)
end = datetime(2015,10,18)
step = timedelta(days=1)
while start <= end:
    print start.strftime('%Y_%m_%d')
    start += step

答案 1 :(得分:1)

使用datetime模块使用str.format()格式化字符串:

d = datetime.datetime(2015, 9, 17)
for i in range(33):
    d += datetime.timedelta(days=1)
    receiver=x.runQuery("copy  dlr_2014_198_bk_todel from 'http://www/sms_sending18.179.67.198_{}_utf.csv.gz' CREDENTIALS delimiter '\t' emptyasnull escape gzip".format(datetime.datetime.strftime(d, '%Y_%m_%d))

使用print()替换查询:

>>> d = datetime.datetime(2015, 9, 17)
>>> for i in range(33):
...     d += datetime.timedelta(days=1)
...     print("copy  dlr_2014_198_bk_todel from 'http://www/sms_sending18.179.67.198_{}_utf.csv.gz' CREDENTIALS delimiter '\t' emptyasnull escape gzip".format(datetime.datetime.strftime(d, '%Y_%m_%d')))
...
copy  dlr_2014_198_bk_todel from 'http://www/sms_sending18.179.67.198_2015_09_18_utf.csv.gz' CREDENTIALS delimiter '    ' emptyasnull escape gzip
copy  dlr_2014_198_bk_todel from 'http://www/sms_sending18.179.67.198_2015_09_19_utf.csv.gz' CREDENTIALS delimiter '    ' emptyasnull escape gzip

(snip)

copy  dlr_2014_198_bk_todel from 'http://www/sms_sending18.179.67.198_2015_10_19_utf.csv.gz' CREDENTIALS delimiter '    ' emptyasnull escape gzip
copy  dlr_2014_198_bk_todel from 'http://www/sms_sending18.179.67.198_2015_10_20_utf.csv.gz' CREDENTIALS delimiter '    ' emptyasnull escape gzip

答案 2 :(得分:1)

试试这个,

from datetime import timedelta, date

def daterange(start_date, end_date):
    for n in range(int((end_date - start_date).days)):
        yield start_date + timedelta(n)

start_date = date(2015, 9, 17) 
end_date = date(2015, 10, 18)

for single_date in daterange(start_date, end_date):
    print single_date.strftime("%Y-%m-%d")

对于包容性迭代,使用第二天,就像使用range()。

答案 3 :(得分:1)

你也可以使用dateutil。 dateutil.rrule集具有您需要的功能

from dateutil.rrule import rrule
from datetime import datetime

format = '%d_%m'
start = datetime(2015,10,8) 
end = datetime(2015,11,8)

mydates = rrule(DAILY, dtstart = start, until = end)
for myday in mydates.count():
    print mydates[i].strftime(format)

你可以为套期添加更多条件,例如设置每月或每周复发,跳过一周中的某些日子,每隔一天撤回等等。

e.g。

rrule(WEEKLY, byweekday(MO,TU), interval = 2 dtstart = start, until = end)  

将在开始和结束之间每隔一周的星期一和星期二给你。