You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()

关键修改说明

  1. 按日期分组:使用defaultdict(list),以datetime.date()作为键,将同一天的所有演出时间字符串存入对应列表,避免重复处理日期。
  2. 日期排序:对分组后的日期键排序,确保输出的日程按时间顺序排列。
  3. 时间格式化:根据当天演出数量,决定是显示单个时间还是首尾时间的范围,匹配你期望的输出格式。
  4. 可选的时间范围过滤:注释部分提供了过滤“周五至周四”周期的逻辑,可根据实际需求启用并调整(比如需要以固定周为周期而非当前周)。

输出效果

运行后会得到你期望的格式:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:50:12