根据给定月份对文件进行分组

时间:2021-07-22 08:23:14

标签: python

我有一个包含多个镶木地板文件的给定 s3 文件夹。文件具有特定格式,例如GROUP_ACCOUNT_USD_20201103.parquet。 S2文件夹可以有多个不同月份的文件。

需要根据文件名中的日期对这些文件进行分组。分组是参数化的,例如,如果月份为 2,那么将创建 6 个组,每个组为 2 个月,所有文件将根据文件名字符串中的日期放置在各自的组中。

我已经创建了一个字典,其中包含作为月份编号的键及其包含落在该键中的文件的列表。

逻辑是这样的:

for keys, values in groupby(filelist, key=group_func):
    for element in group:
        append_value(dict,key,element)

分组函数定义为

def grouping_func(args):
    file = args['Key']
    val = file.split('.')[0].split('_')[1]
    return datetime.datetime.strptime(val,'%Y%m%d').strftime('%m')

附加函数:

def append_value(dict_obj, key, value):
    if key in dict_obj:
        dict_obj[key].append(value) 
    else:
        dict_obj[key] = []
        dict_obj[key].append(value) 

我面临的问题是,当我尝试按 2 个月分组时,分组不正确。我试过 relativedelta(months=2)

并将我的分组功能更改为

def grouping_func(args):
    file = args['Key']
    val = file.split('.')[0].split('_')[1] 
    m =  datetime.datetime.strptime(val,'%Y%m%d')  
    m = m + relativedelta(months=2)  
    return m.strftime('%m')

我猜问题出在 grouping_func 上。

分组函数需要是通用的,以满足任意数量的月、日、周或年。

1 个答案:

答案 0 :(得分:0)

首先你没有正确分割字符串

val = file.split('.')[0].split('_')[1] 

应该

val = file.split('.')[0].split('_')[-1] 

如果分隔文件名时 splitext 不存在,您也应该使用 .

其次,您可以不需要相对增量。您可以创建一个包含按月份分类的所有文件名的字典,然后根据您的时间范围对字典键进行分组。

# categorize files to dictionary per month
def categorize_files(filelist):
    file_dict = {}
    for file in filelist:
        val = file.split('.')[0].split('_')[-1] 
        m =  datetime.datetime.strptime(val,'%Y%m%d')  
        file_dict.setdefault(m.month, []).append(file)
    return file_dict

# group file dictionary according to your desired time frame
def group_by_months(file_dict, months):
    group_dict = {}
    #place if to check if months is >0 and <=12
    groups = [k for k in range(months, 13, months)]
    sorted_keys = sorted(file_dict.keys())
    for key in sorted_keys:
       for gr in groups:
           if int(key) <= gr:
               group_dict.setdefault(str(gr), []).extend(file_dict[key])
               break
    return group_dict

file_dict = categorize_files(filelist)
month_dict = group_by_months(file_dict, 2) # group by 2 months
相关问题