【问题标题】:Pandas group by time with specified start time with non integer minutes熊猫按时间分组,指定开始时间,非整数分钟
【发布时间】:2019-06-22 03:10:54
【问题描述】:

我有一个包含一小时长信号的数据框。我想将它们分组为 10 分钟。问题是开始时间并不是 10 分钟的“倍数”,因此,我没有获得 6 个组,而是获得了 7 个,第一个和最后一个不完整。

这个问题很容易重现

import pandas as pd
import numpy as np
import datetime as dt

rng = pd.date_range('1/1/2011 00:05:30', periods=3600, freq='1S')
ts = pd.DataFrame({'a':np.random.randn(len(rng)),'b':np.random.randn(len(rng))}, index=rng)

interval = dt.timedelta(minutes=10)

ts.groupby(pd.Grouper(freq=interval)).apply(len)

2011-01-01 00:00:00    270
2011-01-01 00:10:00    600
2011-01-01 00:20:00    600
2011-01-01 00:30:00    600
2011-01-01 00:40:00    600
2011-01-01 00:50:00    600
2011-01-01 01:00:00    330
Freq: 10T, dtype: int64

我尝试按照here 的描述解决它,但base 只需要整数分钟。对于上面的示例(从 00:05 之后的 30 秒开始),下面的代码仍然不起作用

ts.groupby(pd.Grouper(freq=interval, base=ts.index[0].minute)).apply(len)

如何设置 Grouper 的通用开始时间?我在这里的预期输出是

2011-01-01 00:05:30    600
2011-01-01 00:15:30    600
2011-01-01 00:25:30    600
2011-01-01 00:35:30    600
2011-01-01 00:45:30    600
2011-01-01 00:55:30    600

【问题讨论】:

    标签: python pandas group-by grouping pandas-groupby


    【解决方案1】:

    base 接受浮点参数。除了分钟,你还必须考虑秒。

    base = ts.index[0].minute + ts.index[0].second/60
    ts.groupby(pd.Grouper(freq=interval, base=base)).size()
    
    2011-01-01 00:05:30    600
    2011-01-01 00:15:30    600
    2011-01-01 00:25:30    600
    2011-01-01 00:35:30    600
    2011-01-01 00:45:30    600
    2011-01-01 00:55:30    600
    Freq: 10T, dtype: int64
    

    【讨论】:

    • 不知道为什么我确定 base 需要是 int 而不是 float。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2014-11-17
    • 1970-01-01
    • 2018-08-31
    • 2015-11-15
    • 2023-03-16
    相关资源
    最近更新 更多