如何在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
相关产品推荐
相关产品推荐

