2016-02-11 69 views
2

我给出了start_year,end_year,start_month和end_month例如Python:在两个日期之间生成YYMM字符串

start_year = 2005 
end_year = 2017 
start_month = 3 
end_month = 2 

我想生成以下字符串: 0503.mat,0504.mat,0505.mat,0506.mat,0507.mat,0508.mat,0509.mat,0510.mat,0511。 0512.mat,0601.mat,。0612.mat,.....,... 1701.mat,1702.mat

即结合年份和月份并生成所有月份之间的这种组合给定的开始年/月和结束年/月

编辑:

.MAT正在重复上的所有输出

这是我到目前为止已经试过:

k = 0 
for yr in range(2005, 2007 + 1): 
    for mn in range(1, 12 + 1): 
     YYMM[k] = "{:02}{:02}.mat".format(yr % 100, mn)) 
     k = k + 1 

但显然它不会覆盖所有个月,如果我在3个月在2005年年内开工,并于2006年

+0

'.mat'是重复所有输出? –

+0

是.mat正在重复所有输出 – Zanam

+0

好吧...那么你到底尝试了什么? –

回答

1

很简单:

start_year = 2005 
end_year = 2007 
start_month = 3 
end_month = 2 
yymm = [(yy, mm) for yy in range(start_year, end_year + 1) for mm in range(1, 13) 
     if (start_year, start_month) <= (yy, mm) <= (end_year, end_month)] 

这将生成的元组

[(2005, 3), (2005, 4), (2005, 5), (2005, 6), (2005, 7), (2005, 8), 
(2005, 9), (2005, 10), (2005, 11), (2005, 12), (2006, 1), (2006, 2), 
(2006, 3), (2006, 4), (2006, 5), (2006, 6), (2006, 7), (2006, 8), 
(2006, 9), (2006, 10), (2006, 11), (2006, 12), (2007, 1), (2007, 2)] 

我会离开的字符串格式化你的列表。

工作原理:我们利用Python的元组比较机制。当比较(x1, x2, ... xn)(y1, y2, ... yn)时,如果它们不相等,那么排序由x1y1确定,如果它们不相等,则通过x2y2确定排序,等等。

编辑: 要生成的字符串,您要使用列表比较,以及:速度更快,而且经常打扫得比for循环:

formatted_yymm = ['{:>02}{:>02}.mat'.format(yy % 100, mm) for yy, mm in yymm] 

结果:

['0503.mat', '0504.mat', '0505.mat', '0506.mat', '0507.mat', '0508.mat', 
'0509.mat', '0510.mat', '0511.mat', '0512.mat', '0601.mat', '0602.mat', 
'0603.mat', '0604.mat', '0605.mat', '0606.mat', '0607.mat', '0608.mat', 
'0609.mat', '0610.mat', '0611.mat', '0612.mat', '0701.mat', '0702.mat'] 
+0

您是否介意在此处发布用于组合字符串的代码,因为我正在考虑编写for循环来组合元素的元素。 – Zanam

+0

@ user1243255请参阅编辑。 – gil

+0

谢谢你永远不会猜到你创建的字符串操作代码。 – Zanam

-2
strings = ["{}{}.mat".format(str(year - 2000).zfill(2), str(month).zfill(2)) \ 
      for year in range(start_year, end_year + 1) \ 
      for month in range(start_month, end_month + 1)] 
继续到第7个月
+0

对不起,我不清楚我的问题。上述解决方案中的月份并不涵盖所有月份。 – Zanam

+0

个月的范围是从1-12个周期 –

0

这可以变得更快,而且可能更易读,而是让数学做的工作:

>>> start = (start_year - 2000) * 12 + start_month 
>>> end = (end_year - 2000) * 12 + end_month 
>>> ["{:02d}{:02d}.mat".format(x // 12, x % 12) for x in range(start, end+1)] 

简称欧tput的

['0503.mat', '0504.mat', '0505.mat', '0506.mat', ... 
'1610.mat', '1611.mat', '1700.mat', '1701.mat', '1702.mat'] 
相关问题