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

如何将聚类算法应用于Tweepy提取的Twitter数据集,实现按小时划分推文/转推活动聚类

嗨,看来你已经成功用Tweepy拿到了Twitter数据集,想要按小时区间来聚类统计推文活动对吧?其实这个需求有两种实现思路——一种是直接按时间规则分组(因为你的聚类规则非常明确,固定小时区间,这种方式简单又高效,完全匹配你的需求),另一种是用聚类算法来实现(适合你上手学习聚类的原理)。下面一步步给你拆解:

第一步:数据预处理(用Pandas)

首先得把原始的日期时间字符串转换成程序能识别的datetime格式,这样才能提取小时信息。假设你的数据已经存在Pandas的DataFrame里,先做这一步:

import pandas as pd

# 模拟你的数据集(实际中可以用read_csv等方法读取你的数据)
tweets_df = pd.DataFrame([
    {"推文内容": "NSW Demons - Watch Melbourne v Sydney tonight", "tweet ID": 1387339243786182657, "日期时间": "2021-05-08 05:55:30"},
    {"推文内容": "Brown in and Harmes returns, Melb v Rich match", "tweet ID": 1387332484715581440, "日期时间": "2021-05-08 05:40:45"},
    {"推文内容": "Kick-off is at 7:10 PM from the Docklands.", "tweet ID": 1385474911448096770, "日期时间": "2021-05-08 05:35:21"},
    {"推文内容": "RT @melbournefc: Kicking with Choco.", "tweet ID": 1385474643541127168, "日期时间": "2021-05-08 05:30:15"}
])

# 将日期时间列转为datetime类型
tweets_df["日期时间"] = pd.to_datetime(tweets_df["日期时间"])
方式一:基于规则的“聚类”(最适合你的需求)

你的需求是把每个小时区间的推文归为一个聚类,比如1点-2点是聚类1,2点-3点是聚类2……这种固定规则的场景,完全不需要复杂的聚类算法,直接用Pandas提取小时并映射成聚类标签就可以:

# 提取每条推文的小时数(0代表0点-1点,1代表1点-2点……23代表23点-0点)
tweets_df["小时"] = tweets_df["日期时间"].dt.hour

# 生成聚类标签:按你的要求,1点-2点对应聚类1,所以给小时数+1(0点-1点对应聚类1,以此类推)
# 如果你想让0点-1点对应聚类0,直接用tweets_df["小时"]即可
tweets_df["聚类标签"] = tweets_df["小时"] + 1

# 按聚类标签统计推文数量
cluster_activity = tweets_df.groupby("聚类标签").agg({"tweet ID": "count"}).rename(columns={"tweet ID": "推文数量"})
print(cluster_activity)

这种方式的优势是:逻辑清晰、运行速度快,完全贴合你预先定义的聚类规则,不需要担心聚类算法的随机性。

方式二:用聚类算法实现(适合学习聚类原理)

如果想真正上手聚类算法(比如K-Means),也可以实现这个需求。核心思路是把时间特征转换成数值,然后用K-Means分成24个聚类(对应24小时):

from sklearn.cluster import KMeans
import numpy as np

# 把小时数转换成K-Means需要的二维数组格式
X = tweets_df["小时"].values.reshape(-1, 1)

# 初始化K-Means,设置24个聚类,固定random_state保证结果可复现
kmeans = KMeans(n_clusters=24, random_state=42)
tweets_df["聚类标签"] = kmeans.fit_predict(X)

# 注意:K-Means的聚类标签是随机分配的,需要把标签和实际小时区间对应起来
# 先获取每个聚类的中心值(接近对应的小时数)
cluster_centers = kmeans.cluster_centers_.flatten()
# 按中心值排序,得到聚类标签的对应顺序
sorted_cluster_indices = np.argsort(cluster_centers)
# 创建映射:原来的随机标签 -> 按小时排序后的标签(比如0对应0点-1点,1对应1点-2点)
cluster_mapping = {old_label: new_label + 1 for new_label, old_label in enumerate(sorted_cluster_indices)}
tweets_df["聚类标签"] = tweets_df["聚类标签"].map(cluster_mapping)

# 统计每个聚类的推文数量
cluster_activity = tweets_df.groupby("聚类标签").agg({"tweet ID": "count"}).rename(columns={"tweet ID": "推文数量"})
print(cluster_activity)

这种方式能让你直观理解聚类算法的工作流程,但因为你的需求是固定规则的小时划分,其实方式一更实用。

可选:可视化聚类结果

如果想把每小时的推文活动模式可视化,可以用Matplotlib画柱状图:

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 6))
cluster_activity.plot(kind="bar", ax=plt.gca(), color="#1DA1F2")
plt.title("Twitter推文/转推小时活动统计")
plt.xlabel("聚类标签(对应小时区间)")
plt.ylabel("推文数量")
plt.xticks(rotation=0)
plt.grid(axis="y", linestyle="--", alpha=0.7)
plt.show()
注意事项
  • 确保日期时间格式正确:如果你的原始数据日期时间格式和示例不同,记得在pd.to_datetime里用format参数指定,比如pd.to_datetime(tweets_df["日期时间"], format="%Y-%m-%d %H:%M:%S")
  • 统一时区:如果数据包含不同时区的推文,先转换成统一时区(比如UTC或当地时间),避免聚类结果出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:39:05