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

如何在JSON文件中匹配指定日期加任意时间并统计活动类型

解决JSON文件中按日期统计活动数量的问题

嘿,我明白你的困扰了——你已经能搞定字符串场景的匹配,但到JSON里按日期(忽略具体时间)统计活动数量就卡壳了对吧?咱们一步步来解决这个问题。

首先,你原来的fnmatch用法有问题:fnmatch.filter()是用来过滤列表的,不是用来检查单个字符串是否匹配模式的,这就是为什么你没得到结果。咱们换正确的方式来实现。

方案1:直接截取日期(最高效,适合固定格式)

既然你的DateTime字段格式是DD/MM/YYYY HH:MM,那日期部分刚好是前10个字符,直接截取就行,简单又高效:

from collections import Counter
import json

with open('dataset_3.json', 'r') as json_file:
    json_data = json.load(json_file)

# 初始化一个字典,用来存每个日期对应的活动统计
date_activity_stats = {}

for item in json_data:
    # 提取日期部分(前10位)
    current_date = item['DateTime'][:10]
    current_activity = item['Activity']
    
    # 如果这个日期还没统计过,就新建一个Counter
    if current_date not in date_activity_stats:
        date_activity_stats[current_date] = Counter()
    # 给对应的活动计数+1
    date_activity_stats[current_date][current_activity] += 1

# 打印所有日期的统计结果
for date, stats in date_activity_stats.items():
    print(f"📅 日期: {date}")
    print(stats)
    print("------------------------")

方案2:用fnmatch正确匹配(适合通配符场景)

如果一定要用fnmatch,得用fnmatch.fnmatch()来检查单个字符串是否符合日期 + 空格 + 任意时间的模式:

from collections import Counter
import json
import fnmatch

with open('dataset_3.json', 'r') as json_file:
    json_data = json.load(json_file)

# 指定你要统计的目标日期
target_date = '18/02/2019'
# 用fnmatch匹配以目标日期开头、后面跟空格和任意内容的字符串
activity_counter = Counter(
    item['Activity'] 
    for item in json_data 
    if fnmatch.fnmatch(item['DateTime'], f"{target_date} *")
)

print(f"日期 {target_date} 的活动统计:")
print(activity_counter)

方案3:正则表达式(适合灵活格式)

如果你的日期格式可能有变化(比如分隔符不同、位数不固定),用正则表达式会更灵活:

from collections import Counter
import json
import re

with open('dataset_3.json', 'r') as json_file:
    json_data = json.load(json_file)

target_date = '18/02/2019'
# 编译正则:以目标日期开头,后面跟一个空格(转义特殊字符避免出错)
date_pattern = re.compile(f"^{re.escape(target_date)} ")

activity_counter = Counter(
    item['Activity'] 
    for item in json_data 
    if date_pattern.match(item['DateTime'])
)

print(f"日期 {target_date} 的活动统计:")
print(activity_counter)

选哪个方案?

  • 如果DateTime格式完全固定(都是DD/MM/YYYY HH:MM),方案1是最优解,速度最快,代码也最直观。
  • 如果需要简单的通配符匹配,比如匹配某月份的所有日期(比如*/02/2019 *),用方案2。
  • 如果日期格式不固定,或者需要更复杂的匹配逻辑,用方案3。

内容的提问来源于stack exchange,提问作者Bat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:04:49