我需要以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循环中使用的日期?
答案 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)
将在开始和结束之间每隔一周的星期一和星期二给你。