按 python 中的日期和总和值对非唯一日期时间列进行分组

Group non-unique datetime column by date and sum values in python

我的数据框 df 如下:

         start_time                 end_time        count
0   2020-02-03 08:42:21.997 2020-02-03 09:34:18.737 3116
1   2020-02-03 09:34:18.837 2020-02-03 10:16:56.583 2557
2   2020-02-03 10:17:00.480 2020-02-03 13:18:51.540 10911
3   2020-02-03 13:18:51.640 2020-02-03 14:01:23.263 2551
4   2020-02-03 14:01:23.363 2020-02-03 14:43:56.977 255

我想仅按 start_time 列的 date 分组,并在同一天对所有对应的 count 值求和。我从这个 post 中找到了相关答案。

使用此方法:

data.groupby(data.date.dt.year)

但是,我收到错误消息:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-46-7618d5285bb9> in <module>()
      1 
----> 2 df.groupby(df.date.dt.year)      # Adding ['start_time'] will return 'AttributeError: 'Series' object has no attribute 'date''.
      3 
      4 
      5 

/usr/local/lib/python3.6/dist-packages/pandas/core/generic.py in __getattr__(self, name)
   5177             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5178                 return self[name]
-> 5179             return object.__getattribute__(self, name)
   5180 
   5181     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'date'

问题是什么?如何按 日期 start_time 列中的这些非唯一日期时间值进行分组并对这些值求和?


编辑:

事实上,我能够做到这一点

import datetime 
df['date'] = df['start_time'].dt.date       # Group by 'date' of 'datetime' column
df.groupby('date').sum()                    # Sum

但我想知道我是否可以直接这样做,可能是更直接的方式,如上述 post.

中的答案所示的单行代码

超级接近,datetime.dt.date 是您访问日期时间对象 (https://www.geeksforgeeks.org/python-pandas-series-dt-date/) 的日期部分的方式。尝试:

data.groupby(data["start_time"].dt.date)["count"].sum()

以下是我认为您遗漏的有关索引的一些背景信息:

当我们写入 data["start_time"] 时,我们从您的数据框 data 中获取列 start_time。获取此列的等效方法是使用 data.start_time。当您尝试访问 data.date(相当于 data["date"])时,我们会收到属性错误,因为您的数据框 data 没有名为 date.[=32 的列=]

如果 start_time 列是 datettime 类型,那么它有一个名为 dt 的属性,该属性具有 date 属性,这就是我们想要分组的依据.我们可以通过 data.start_time.dt.datedata["start_time"].dt.date 访问它。

当您编写 data["date"] = data["start_time"] 时,您将在数据框中创建一个名为 date 的新列,它等于您的 start_time 列。您现在可以通过 data.date(或 data["date"])访问它,这就是您的解决方案有效的原因。