如何用Python 3解析JSON日程时间戳并生成按天分组的时段列表
解决演出时间按天分组并格式化输出的问题
核心问题分析
你当前代码重复打印日期的原因是:用完整的datetime对象判断是否为同一天,但同一天的不同演出时间是不同的datetime实例,导致每次循环都触发日期打印。解决思路是先按日期分组收集所有演出时间,再统一格式化输出。
修改后的代码
from collections import defaultdict import json from datetime import datetime, timezone def ShowtimesParseJSON(): with open('showtimes.json') as file: data = json.load(file) print('\n') for title in data['titles']: print('\n') print(f"{title.get('title')} ( {title.get('rating')} )") print('-------------------------------------') # 用字典按日期分组存储当天的所有演出时间 daily_shows = defaultdict(list) total_shows = 0 for perf in title['perf']: total_shows += 1 # 转换时间戳为UTC datetime对象 this_dt = datetime.fromtimestamp(perf.get('start'), tz=timezone.utc) # 提取日期作为分组键(年-月-日) date_key = this_dt.date() # 格式化时间字符串(12小时制,带分钟) time_str = f"{this_dt:%#I:%M}" daily_shows[date_key].append(time_str) # 对日期排序,保证输出顺序正确 sorted_dates = sorted(daily_shows.keys()) # 可选:过滤周五到周四的时间范围 # 先确定当前周的周五和下周四(示例逻辑,可根据实际需求调整) # today = datetime.now(timezone.utc).date() # # 计算最近的周五:today + (4 - today.weekday()) %7 # friday = today + datetime.timedelta(days=(4 - today.weekday()) %7) # # 下周四是周五+6天 # next_thursday = friday + datetime.timedelta(days=6) # sorted_dates = [d for d in sorted_dates if friday <= d <= next_thursday] # 遍历分组后的日期,格式化输出 for date in sorted_dates: # 格式化日期显示(如 Fri (Mar 03)) date_str = f"{datetime(date.year, date.month, date.day, tzinfo=timezone.utc):%a (%b %d)}" # 格式化时间:如果多个时间,用“-”连接首尾;单个时间直接显示 times = daily_shows[date] if len(times) >= 2: time_range = f"{times[0]} - {times[-1]}" else: time_range = times[0] print(f"{date_str}\t{time_range}") print(f'Total shows: {total_shows}') print('-------------------------------------') ShowtimesParseJSON()
关键修改说明
- 按日期分组:使用
defaultdict(list),以datetime.date()作为键,将同一天的所有演出时间字符串存入对应列表,避免重复处理日期。 - 日期排序:对分组后的日期键排序,确保输出的日程按时间顺序排列。
- 时间格式化:根据当天演出数量,决定是显示单个时间还是首尾时间的范围,匹配你期望的输出格式。
- 可选的时间范围过滤:注释部分提供了过滤“周五至周四”周期的逻辑,可根据实际需求启用并调整(比如需要以固定周为周期而非当前周)。
输出效果
运行后会得到你期望的格式:
80 FOR BRADY ( PG ) ------------------------------------- Fri (Mar 03) 1:00 - 3:00 Sat (Mar 04) 3:05 - 5:00 ... Thu (Mar 09) 1:00 - 3:00 Total shows: 14 -------------------------------------
内容的提问来源于stack exchange,提问作者b.wyn
相关产品推荐
相关产品推荐

