【问题标题】:Pandas: Counting frequency of datetime objects in a columnPandas:计算列中日期时间对象的频率
【发布时间】:2015-11-16 05:19:04
【问题描述】:

我有一列(来自我的原始数据),我已将它从字符串转换为 Pandas 中的日期时间对象。

该列如下所示:

0     2012-01-15 11:10:12
1     2012-01-15 11:15:01
2     2012-01-16 11:15:12
3     2012-01-16 11:25:01
...
4     2012-01-22 11:25:11
5     2012-01-22 11:40:01
6     2012-01-22 11:40:18
7     2012-01-23 11:40:23
8     2012-01-23 11:40:23
...
9     2012-01-30 11:50:02
10    2012-01-30 11:50:41
11    2012-01-30 12:00:01
12    2012-01-30 12:00:34
13    2012-01-30 12:45:01
...
14    2012-02-05 12:45:13
15    2012-01-05 12:55:01
15    2012-01-05 12:55:01
16    2012-02-05 12:56:11
17    2012-02-05 13:10:01
...
18    2012-02-11 13:10:11
...
19    2012-02-20 13:25:02
20    2012-02-20 13:26:14
21    2012-02-20 13:30:01
...
22    2012-02-25 13:30:08
23    2012-02-25 13:30:08
24    2012-02-25 13:30:08
25    2012-02-26 13:30:08
26    2012-02-27 13:30:08
27    2012-02-27 13:30:08
28    2012-02-27 13:30:25
29    2012-02-27 13:30:25

我想做的是计算每个日期发生的频率。如您所见,我遗漏了一些日期,但如果我要手动计算频率(对于可见值),我会:

2012-01-15 - 2(频率)

2012-01-16 - 2

2012-01-22 - 3

2012-01-23 - 2

2012-01-30 - 5

2012-02-05 - 5

2012-02-11 - 1

2012-02-20 - 3

2012-02-25 - 3

2012-02-26 - 1

2012-02-27 - 4

这是每天的频率,我想数一数。到目前为止,我已经尝试过:

df[df.str.contains(r'^\d\d\d\d-\d\d-\d\d')].value_counts()

我知道它失败了,因为这些不是“字符串”对象,但我不确定如何计算。

我也查看了 .dt 属性,但 Pandas 文档对这些简单的频率计算非常冗长。


另外,为了概括这一点,我将如何:

  1. 将每日频率应用于每周频率(例如周一至周日)
  2. 将每日频率应用于每月频率(例如,我在列中看到“2012-01-**”的次数)
  3. 在其他列中使用每日/每周/每月限制(例如,如果我有一个包含“GET 请求”的列,我想知道每天发生多少,然后是每周,然后是每月)
  4. 应用每周限制和另一个限制(例如,我有一个返回“404 Not found”的列,我想查看我每周收到多少“404 Not found”)

也许解决方案很长,我可能需要做很多事情:拆分-应用-组合...但我相信 Pandas 简化/抽象了很多工作,这就是为什么我现在卡住了。

这个文件的来源可以被认为是一个服务器日志文件。

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    可以先获取日期时间的日期部分,然后使用value_counts

    s.dt.date.value_counts()
    

    小例子:

    In [12]: s = pd.Series(pd.date_range('2012-01-01', freq='11H', periods=6))
    
    In [13]: s
    Out[13]:
    0   2012-01-01 00:00:00
    1   2012-01-01 11:00:00
    2   2012-01-01 22:00:00
    3   2012-01-02 09:00:00
    4   2012-01-02 20:00:00
    5   2012-01-03 07:00:00
    dtype: datetime64[ns]
    
    In [14]: s.dt.date
    Out[14]:
    0    2012-01-01
    1    2012-01-01
    2    2012-01-01
    3    2012-01-02
    4    2012-01-02
    5    2012-01-03
    dtype: object
    
    In [15]: s.dt.date.value_counts()
    Out[15]:
    2012-01-01    3
    2012-01-02    2
    2012-01-03    1
    dtype: int64
    

    【讨论】:

    • 我如何使用日期作为其他列计数频率的限制?或者我会为此使用数组切片吗?
    • 你到底是什么意思?能给我举个例子吗?如果要基于多列进行统计,可以使用groupby([..]).count()
    • 我在上面的 4 点中提到过。我想概括计算(周)和(月)的频率。虽然我可以轻松地添加一周的 7 个每日频率和一个月的 30 个每日频率,但当我想比较我每周/每月计算“GET 请求”的场景时,问题就会出现。我应该拆分数据框来做到这一点吗?如果是这样,我将如何平均拆分它(按日期:例如,在 1 月 1 日至 1 月 31 日、2 月 1 日至 2 月 28 日、3 月 1 日至 3 月 31 日等之前拆分我的数据框)
    • df.groupby(pd.Grouper(key='GET requests', freq='M')).count() 这样的东西会按月频率进行。
    【解决方案2】:

    聚会迟到了,但现在是dataframe.date_time_column.resample('1D').count()

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      df.groupby(level=0).count()
      

      这要求您的日期是索引。

      【讨论】:

        猜你喜欢
        • 2018-03-13
        • 2017-04-19
        • 2021-08-07
        • 1970-01-01
        • 2021-03-29
        • 1970-01-01
        • 1970-01-01
        • 2016-04-21
        • 2022-12-05
        相关资源
        最近更新 更多