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