首页 > 解决方案 > 带有时间戳的巨大 CSV 文件,创建一个包含一年中每个月的条目数的图表

问题描述

我有一个相当大的 csv 文件,其中包含自一月以来我在 spotify 上听过的每一首歌。csv 文件包含 UNIX 时间戳和文本时间戳(格式为:2018 年 12 月 19 日,13:19)。我想制作一个每月收听的歌曲数量的图表。

我已经将 CSV 文件导入到 pandas 数据框中,并将文本日期时间转换为 pandas 日期时间:

scrobbles['text_timestamp'] = pd.to_datetime(scrobbles['text_timestamp'])

我玩过scrobbles_split_month = [g for n, g in scrobbles.set_index('text_timestamp').groupby(pd.Grouper(freq='M'))] 这给了我一个包含 12 个数据帧的数据帧,每个数据帧都是每个月的所有歌曲。我然后计算每个数据帧中的每条记录,以获得每个月的歌曲数量,如下所示:

month_counts = [] for idx in range(len(scrobbles_split_month)): df = scrobbles_split_month[idx] month_counts.append(df['track'].count())

这给了我这样的输出: [11, 309, 698, 1874, 1089, 901, 1193, 3105, 2220, 3065, 3095, 2202] 其中每条记录是每月的歌曲。

我想做的是使用 maatplotlib 将这些信息绘制在折线图上,x 轴为月份,y 为歌曲计数。

标签: pythonpandasmatplotlib

解决方案


我制作了一个类似于您不久前正在寻找的图表。如果我理解正确,您只需要创建一个通用日期范围以用作 x 轴。我所做的是使用我的每月聚合及其相应的月/年日期时间值重新索引数据框。所以像:

# your original code
scrobbles['text_timestamp'] = pd.to_datetime(scrobbles['text_timestamp'])

month_counts = []
    for idx in range(len(scrobbles_split_month)):
        df = scrobbles_split_month[idx]
        month_counts.append(df['track'].count())

# and then set the index to the time stamp which can be your x var and monthly_counts as # your y var
df.index = scrobbles['text_timestamp']
df['monthly_counts'] = month_counts

```

您可能想检查 pandas 方法:resamplegroupby适用于日期时间值。尽管您可能希望将原始时间戳转换为仅它们的月/年值以及分组: from datetime import datetime as dt df.index = pd.Series(df.index).apply(lambda x: dt(x.year, x.month, 1)


推荐阅读