【问题标题】:Group non-unique datetime column by date and sum values in python在python中按日期和总和值对非唯一日期时间列进行分组
【发布时间】:2020-03-12 23:53:57
【问题描述】:

我有如下数据框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

但我想知道我是否可以直接做,可能更直接,如上述帖子中的答案所示的单线。

【问题讨论】:

标签: python pandas datetime data-processing


【解决方案1】:

非常接近,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 的列。

如果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"])访问它,这就是您的解决方案有效的原因。

【讨论】:

  • 你需要说明你可以在 groupby 中传递一个映射函数
  • 谢谢。它起作用了:) 知道错误是如何产生的吗?
  • 列日期不在您的数据框中
  • 是的,您尝试使用 data.date 从数据框中访问日期列,这相当于 data['date']
  • 在使用 dt.date 访问日期后首先获得 start_time 系列 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 2016-10-28
  • 2012-07-08
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多