我有一个包含多个镶木地板文件的给定 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
上。
分组函数需要是通用的,以满足任意数量的月、日、周或年。
答案 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