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

如何在Pycord中统计Discord频道每日消息数量?

按日期统计频道消息数量的解决方案

问题原因

你之前的代码返回1的核心原因是:message.created_at返回的是包含时分秒的datetime对象,即使是同一天的消息,只要发送时间(时分秒)不同,这两个datetime对象就会被判定为不相等。所以dates.count(dates[0])只能找到和第一条消息时间完全一致的条目,结果自然是1。

解决思路

我们需要提取datetime对象中的日期部分(仅保留年-月-日),忽略时分秒的差异,再统计每个日期的出现次数。Python中可以通过datetime.date()方法获取纯日期对象,同一日期的date对象是完全相等的,适合用来做统计的键。

方案一:使用collections.Counter(推荐)

Counter是Python标准库中专门用于计数的工具,使用起来简洁高效:

from collections import Counter

# 初始化计数器
date_counts = Counter()

async for message in channel.history(limit=None):
    # 提取消息的日期部分(忽略时分秒)
    message_date = message.created_at.date()
    # 对应日期计数+1
    date_counts[message_date] += 1

# 遍历输出统计结果(按日期排序)
for date, count in sorted(date_counts.items()):
    print(f"{date}: {count} 条消息")

方案二:使用普通字典

如果不想导入额外模块,用普通字典也能实现:

date_counts = {}

async for message in channel.history(limit=None):
    message_date = message.created_at.date()
    # 检查日期是否已在字典中,存在则计数+1,否则初始化为1
    if message_date in date_counts:
        date_counts[message_date] += 1
    else:
        date_counts[message_date] = 1

# 按日期排序后输出
for date, count in sorted(date_counts.items()):
    print(f"{date}: {count} 条消息")

额外说明

  • 如果需要按特定格式输出日期(比如YYYY-MM-DD字符串),可以用strftime()方法转换:
    formatted_date = message.created_at.strftime("%Y-%m-%d")
    
    之后用这个字符串作为字典的键即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:01:01