如何利用Possibility值将元组转换为指定结构的事件列表
解决Python事件日期重复与递增日期生成问题
问题背景
现有元组形式的原始数据:
import ast data = (("Jeff Celebration", "{\"2010-09-02\": {\"Possibility\": 3, \"Confidence\":93}, \"2011-09-01\": {\"Possibility\": 3, \"Confidence\":86}}") , ("Queens Bday", "{\"2010-02-18\": {\"Possibility\": 2, \"Confidence\":88}, \"2011-02-17\": {\"Possibility\": 2, \"Confidence\":88}}"))
已完成数据解析代码,将原始数据转换为事件名对应日期与Possibility的字典:
data = {i[0]: {key:val.get('Possibility') for key, val in ast.literal_eval(i[1]).items()} for i in data}
需要实现的需求:
- 针对每个日期对应的Possibility值,重复对应事件名并添加数字下标(如Possibility为3则生成
事件名_1、事件名_2、事件名_3) - 同时生成从该日期开始的连续递增日期(如起始日期为2010-09-02,生成3个日期则是2010-09-02、2010-09-03、2010-09-04)
- 最终整理为包含
event和keys两个列表的字典,格式如下:
data = {'event': ['Jeff Celebration_1', 'Jeff Celebration_2', 'Jeff Celebration_3', 'Jeff Celebration_1', 'Jeff Celebration_2', 'Jeff Celebration_3', 'Queens Bday_1', 'Queens Bday_2', 'Queens Bday_1', 'Queens Bday_2'], 'keys': ['2010-09-02', '2010-09-03', '2010-09-04', '2011-09-01', '2011-09-02', '2011-09-03', '2010-02-18', '2010-02-19', '2011-02-17', '2011-02-18']}
解决方案代码
需要引入datetime模块处理日期递增,具体实现如下:
import ast from datetime import datetime, timedelta # 原始数据 data = (("Jeff Celebration", "{\"2010-09-02\": {\"Possibility\": 3, \"Confidence\":93}, \"2011-09-01\": {\"Possibility\": 3, \"Confidence\":86}}") , ("Queens Bday", "{\"2010-02-18\": {\"Possibility\": 2, \"Confidence\":88}, \"2011-02-17\": {\"Possibility\": 2, \"Confidence\":88}}")) # 解析数据为事件-日期-Possibility字典 parsed_data = {i[0]: {key:val.get('Possibility') for key, val in ast.literal_eval(i[1]).items()} for i in data} event_list = [] keys_list = [] # 遍历每个事件及其日期信息 for event_name, date_info in parsed_data.items(): for date_str, count in date_info.items(): # 转换日期字符串为datetime对象 base_date = datetime.strptime(date_str, "%Y-%m-%d") # 根据Possibility次数生成对应的事件名和日期 for idx in range(1, count+1): # 生成带下标事件名 event_list.append(f"{event_name}_{idx}") # 生成递增日期并转为字符串 current_date = base_date + timedelta(days=idx-1) keys_list.append(current_date.strftime("%Y-%m-%d")) # 组装最终结果 final_data = {'event': event_list, 'keys': keys_list} print(final_data)
代码说明
- 数据解析:用
ast.literal_eval将原始数据中的JSON字符串转换为Python字典,得到事件名对应各日期的Possibility值。 - 列表初始化:创建
event_list和keys_list两个空列表,分别存储生成的带序号事件名和递增日期。 - 日期与事件生成:
- 将日期字符串转为
datetime对象,方便后续日期递增计算。 - 根据Possibility的次数循环,生成从1到count的序号,拼接成带后缀的事件名。
- 用
timedelta(days=idx-1)计算递增日期(第一次循环为原日期,后续依次加1天),再转回字符串格式存入日期列表。
- 将日期字符串转为
- 结果组装:将两个列表打包为要求的字典格式。
内容的提问来源于stack exchange,提问作者Lata
相关产品推荐
相关产品推荐

