从两个满足一个条件的列表中选择文件

时间:2020-09-23 15:42:02

标签: python-3.x

我有两个文件名列表:

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',这样我就必须遍历两个列表,直到文件年末。

1 个答案:

答案 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