如何用Python统计并绘制CSV中推文的5分钟时间间隔频率图
解决CSV时间序列推文统计与可视化问题
嗨,我来帮你搞定这个每5分钟推文数量统计和绘图的需求!咱们一步步来拆解实现:
1. 先把时间列转成带时区的datetime类型
首先读入CSV后,得把Time列从字符串转换成pandas能识别的带UTC时区的datetime对象——这是后续所有时间操作准确的基础:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读入CSV数据 tweets_df = pd.read_csv('valid_tweets.csv') # 转换Time列为带UTC时区的datetime格式 tweets_df['Time'] = pd.to_datetime(tweets_df['Time'], utc=True)
2. 筛选你关注的两小时时间范围
假设你要分析的是2016-10-20 01:55:00+00:00到2016-10-20 03:55:00+00:00这个时间段,先把范围内的数据筛选出来,避免统计无关内容:
# 定义目标时间范围(注意要带UTC时区) start_time = pd.to_datetime('2016-10-20 01:55:00', utc=True) end_time = pd.to_datetime('2016-10-20 03:55:00', utc=True) # 筛选出该时间范围内的推文 filtered_tweets = tweets_df[(tweets_df['Time'] >= start_time) & (tweets_df['Time'] <= end_time)]
3. 按5分钟间隔统计推文数量
这里提供两种适配你需求的方法,你可以根据习惯选择:
方法一:用resample(推荐,更贴合时间序列场景)
先把Time列设为索引,然后用resample按5分钟分组统计数量,代码更简洁:
# 按5分钟间隔统计推文数,'5T'等价于'5min',代表5分钟 tweet_counts = filtered_tweets.resample('5T', on='Time').size()
不用把Time设为索引的话,直接用on='Time'参数指定时间列即可,非常方便
方法二:结合你写的pd.date_range实现
如果你想直接用你之前定义的时间间隔序列,可以用pd.cut把时间分到对应的区间里:
# 生成你需要的5分钟时间间隔 bins time_bins = pd.date_range(start='2016-10-20 01:55:00', end='2016-10-20 03:55:00', freq='5min', tz='UTC') # 把每条推文的时间映射到对应的时间区间 filtered_tweets['Time_Bin'] = pd.cut(filtered_tweets['Time'], bins=time_bins) # 统计每个区间的推文数,并按时间顺序排序 tweet_counts = filtered_tweets['Time_Bin'].value_counts().sort_index()
4. 绘制可视化图表
统计完成后,咱们把结果绘制成直观的图表,柱状图适合展示每个区间的数量对比,折线图更能体现时间趋势:
plt.figure(figsize=(12,6)) # 绘制柱状图 tweet_counts.plot(kind='bar', color='#1f77b4') # 如果你更倾向折线图,替换成下面这行: # tweet_counts.plot(kind='line', marker='o', color='#1f77b4') plt.title('每5分钟推文数量统计(2小时时间范围)') plt.xlabel('时间间隔') plt.ylabel('推文条数') plt.xticks(rotation=45, ha='right') # 旋转x轴标签,避免重叠 plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
小提示
- 一定要确保时间列的时区统一为UTC,避免时区转换导致的统计误差
- 如果你的CSV数据量很大(18万行),
resample方法的效率会比cut更高一些
内容的提问来源于stack exchange,提问作者Mona Jalal
相关产品推荐
相关产品推荐

