Python Pandas:将日期时间列分组为小时和分钟聚合

Posted

技术标签:

【中文标题】Python Pandas:将日期时间列分组为小时和分钟聚合【英文标题】:Python Pandas: Group datetime column into hour and minute aggregations 【发布时间】:2013-04-22 08:58:25 【问题描述】:

这似乎很简单,但经过将近一整天的时间,我还没有找到解决方案。我已经用 read_csv 加载了我的数据框,并且很容易将日期和时间列解析、组合和索引到一列中,但现在我希望能够根据小时和分钟分组来重塑和执行计算,类似于你可以在excel支点。

我知道如何重新采样到小时或分钟,但它维护与每个小时/分钟相关的日期部分,而我只想将数据集聚合到小时和分钟,类似于在 excel 数据透视表中分组并选择“小时”和“分钟”,但不选择其他任何内容。

任何帮助将不胜感激。

【问题讨论】:

从您拥有的每个datetime 对象中获取time 对象是否有帮助?您可以从 dataframe.index 创建一个 pandas.Series 对象,然后将其分配给索引(替换当前索引)。你能“打印”你的数据框的一些行吗? 谢谢。如果这就是您的意思,我不熟悉使用时间对象从日期时间列中获取时间。我刚刚找到了一种非常接近我需要的方法,分别使用以下代码每小时和每分钟,但是有没有更简单的方法可以做到这一点,尤其是每小时和每分钟在一起的方法?: hourly = ims_havas.groupby( ims_havas.index.hour).sum() 【参考方案1】:

你不能吗,df 是你的 DataFrame:

times = pd.to_datetime(df.timestamp_col)
df.groupby([times.dt.hour, times.dt.minute]).value_col.sum()

【讨论】:

是的,这对我也很有效,但我有后续问题:如何在 matlibplot 中使用这个“分组时间序列”作为我的 x 轴? 我不得不处理df.groupby([times.dt.hour, times.dt.minute]) ... 这在 Python 3 中有效吗? pd.to_datetime 函数似乎创建了一个 pandas.core.series.Series 对象,但没有任何日期时间功能。我得到“AttributeError:'系列'对象没有属性'小时'”。 @AdrianKeister 它可以工作,你只需要加上前缀 dt。在这种特定情况下,它会像times.dt.hour,就像@akilat90 所说的那样。【参考方案2】:

我有上面 Wes & Nix 答案的替代方案,只需一行代码,假设您的列已经是日期时间列,您不需要分别获取小时和分钟属性:

df.groupby(df.timestamp_col.dt.time).value_col.sum()

【讨论】:

【参考方案3】:

Wes 的代码对我不起作用。但是 DatetimeIndex 函数 (docs) 做到了:

times = pd.DatetimeIndex(data.datetime_col)
grouped = df.groupby([times.hour, times.minute])

DatetimeIndex 对象是 pandas 中时间的表示。第一行创建一个日期时间数组。第二行使用此数组获取所有行的小时和分钟数据,允许按这些值对数据进行分组 (docs)。

【讨论】:

我喜欢你使用另一个 df 进行分组的方式。我会不必要地创建列。【参考方案4】:

我在搜索这种类型的 groupby 时遇到了这个问题。 Wes 上面的代码对我不起作用,不知道是不是因为pandas 随着时间的推移发生了变化。

pandas 0.16.2,我最后做的是:

grp = data.groupby(by=[data.datetime_col.map(lambda x : (x.hour, x.minute))])
grp.count()

您将 (hour, minute) 元组作为分组索引。如果你想要多索引:

grp = data.groupby(by=[data.datetime_col.map(lambda x : x.hour),
                       data.datetime_col.map(lambda x : x.minute)])

【讨论】:

以上是关于Python Pandas:将日期时间列分组为小时和分钟聚合的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用两个日期之间的每小时日期时间有效地填充 python 中的 pandas df 列?

使用 Python,如何按小时对 Dataframe 中的列进行分组?

pandas如何去掉时间列的小时只保留日期

使用 Pandas 将数据框中的 Python 对象列转换为没有日期的时间

Pandas:直接从日期时间列返回小时

Pandas:以列表形式按列分组的每个日期的频率