使用pandas按日期计算值的频率

jcb*_*ges 21 datetime time-series count dataframe pandas

假设我有以下时间序列:

Timestamp              Category
2014-10-16 15:05:17    Facebook
2014-10-16 14:56:37    Vimeo
2014-10-16 14:25:16    Facebook
2014-10-16 14:15:32    Facebook
2014-10-16 13:41:01    Facebook
2014-10-16 12:50:30    Orkut
2014-10-16 12:28:54    Facebook
2014-10-16 12:26:56    Facebook
2014-10-16 12:25:12    Facebook
...
2014-10-08 15:52:49    Youtube
2014-10-08 15:04:50    Youtube
2014-10-08 15:03:48    Vimeo
2014-10-08 15:02:27    Youtube
2014-10-08 15:01:56    DailyMotion
2014-10-08 13:27:28    Facebook
2014-10-08 13:01:08    Vimeo
2014-10-08 12:52:06    Facebook
2014-10-08 12:43:27    Facebook
Name: summary, Length: 600
Run Code Online (Sandbox Code Playgroud)

我想计算每周和每年的每个类别(时间序列中的唯一值/因子).

Example:

    Week/Year      Category      Count
    1/2014         Facebook      12
    1/2014         Google        5
    1/2014         Youtube       2
...    
    2/2014         Facebook      2
    2/2014         Google        5
    2/2014         Youtube       20
...
Run Code Online (Sandbox Code Playgroud)

如何使用Python pandas实现这一目标?

Ale*_*ley 19

将您的Series转换为DataFrame并使用Pandas的groupby功能可能是最简单的(如果您已经有一个DataFrame,那么请直接跳到下面添加另一个列).

如果调用了Series s,则将其转换为DataFrame,如下所示:

>>> df = pd.DataFrame({'Timestamp': s.index, 'Category': s.values})
>>> df
       Category           Timestamp
0      Facebook 2014-10-16 15:05:17
1         Vimeo 2014-10-16 14:56:37
2      Facebook 2014-10-16 14:25:16
...
Run Code Online (Sandbox Code Playgroud)

现在为周和年添加另一列(一种方法是使用apply并生成周/年数字的字符串):

>>> df['Week/Year'] = df['Timestamp'].apply(lambda x: "%d/%d" % (x.week, x.year))
>>> df
             Timestamp     Category Week/Year
0  2014-10-16 15:05:17     Facebook   42/2014
1  2014-10-16 14:56:37        Vimeo   42/2014
2  2014-10-16 14:25:16     Facebook   42/2014
...
Run Code Online (Sandbox Code Playgroud)

最后,分组依据'Week/Year''Category'汇总size()来获取计数.对于您问题中的数据,这会产生以下结果:

>>> df.groupby(['Week/Year', 'Category']).size()
Week/Year  Category   
41/2014    DailyMotion    1
           Facebook       3
           Vimeo          2
           Youtube        3
42/2014    Facebook       7
           Orkut          1
           Vimeo          1
Run Code Online (Sandbox Code Playgroud)


cwh*_*and 6

将时间戳列转换为周数,然后按该周数和value_count分类变量进行分组,如下所示:

df.groupby('week_num').Category.value_counts()
Run Code Online (Sandbox Code Playgroud)

我假设week_num从 TimeStamp 列创建了一个新列。

  • 拥有带有日期列(日期时间类型)“dates”的 DataFrame“df”,您可以使用“df.groupby(df["dates"].dt.minute).size()”。这告诉您每分钟有多少行落下。 (3认同)

小智 5

更清楚地说,您不需要首先创建一个名为“week_num”的新列。

df.groupby(by=lambda x: "%d/%d" % (x.week(), x.year())).Category.value_counts()
Run Code Online (Sandbox Code Playgroud)

by 函数会自动调用索引的每个时间戳对象,将它们转换为周和年,然后按周和年进行分组。