我有两个文件名列表:
1。。第一个列表包含一年的文件路径,每5分钟有时间步长,我仅选择了我感兴趣的时间后就来到了此列表。 每个文件都由2011年组成,相关的日期从001到365,以及小时0235。
A = ['20110010235', '20110011340', '20110020140', '20110020315',
'20110020320', '20110021245', '20110021420', '20110021425',
'20110030220', '20110030225', '20110030400', '20110031325',
'20110031330', '20110040125', '20110040130', '20110040305',
'20110041230', '20110041235', '20110041410', '20110050210',
'20110051315', '20110060255', '20110061220', '20110061355',
'20110061400', '20110070155', '20110070200', '20110070335',
'20110071300', '20110071305', '20110071440', '20110080240',
'20110080245', '20110081210', '20110081345', '20110090145',
'20110090325', '20110091250', '20110091430', '20110100230',
'20110100405', '20110101330', '20110101335', '20110110130',
'20110110135', ..., '20113651325']
2。。第二个列表包含ERA-5产品的文件路径,在这个列表中,我拥有在“ 2011年”同一年选择的文件,但是这些文件有一个时间1个步骤。
B = ['201101010000', '201101010100', '201101010200', '201101010300',
'201101010400', '201101010500', '201101010600', '201101010700',
'201101010800', '201101010900', '201101011000', '201101011100',
'201101011200', '201101011300', '201101011400', '201101011500',
'201101011600', '201101011700', '201101011800', '201101011900',
'201101012000', '201101012100', '201101012200', '201101012300',
..., '201112312300']
每个文件都是由2011年组成的,其天数从1到31,或者取决于您每个月的天数,与之前的相关列表不同。每小时的小时数从0000到2300。
我遇到以下问题,我必须从第二个列表中选择属于同一天的文件和时间最近的文件。
例如,如果在第一个列表中我有文件20110010235
,那么我将不得不从第二个列表中选择时间最近的文件,在这种情况下,它应该是'201101010300'
,对于下一个文件第一个列表'20110011340'
中的文件,我将不得不从第二个列表中选择文件'201101011400'
,这样我就必须遍历两个列表,直到文件年末。
答案 0 :(得分:0)
这应该可行,只要您可以对两个列表进行排序。
from datetime import datetime
from datetime import timedelta
def cnvrt_AtoTime(val):
yr = int(val[0:4])
dy = int(val[4:7])
hr = int(val[7:9])
mn = int(val[9:])
tv = datetime(yr, 1, 1, hr,mn)
if dy > 1:
tv = tv + timedelta(days= dy-1)
return tv
def cnvrt_BtoTime(val):
yr = int(val[0:4])
mth = int(val[4:6])
dy = int(val[6:8])
hr = int(val[8:10])
mn = int(val[10:])
return datetime(yr, mth, dy, hr, mn)
def match_files(a_list,b_list):
a_list.sort()
b_list.sort()
bptr = 1
aptr = 0
out_list = []
while aptr < len(a_list) and bptr <len(b_list):
atme = cnvrt_AtoTime(a_list[aptr])
btlst = cnvrt_BtoTime(b_list[bptr-1])
btnxt = cnvrt_BtoTime(b_list[bptr])
if btnxt >= atme:
kn = btnxt - atme
kl = btlst - atme
if abs(kl) < abs(kn):
out_list.append((a_list[aptr], b_list[bptr-1]))
bptr += 1
aptr += 1
else:
out_list.append((a_list[aptr],b_list[bptr]))
bptr += 2
aptr += 1
else:
bptr += 1
return out_list