Pandas按时间分组并指定开始时间

问题描述

用于base=480将起点移动480分钟(8小时)。单位为分钟,因为石斑鱼的频率为570T(T,此处表示分钟):

import datetime
import pandas as pd

def main():

    start_datetime = datetime.datetime(2013, 1, 1, 8)
    s = pd.Series(
        range(8),
        pd.to_datetime([
            '20130101 8:34:04', '20130101 10:34:08', '20130101 10:34:08',
            '20130101 12:34:15', '20130101 1:34:28', '20130101 3:34:54',
            '20130101 4:34:55', '20130101 5:29:12']))

    bar_size = datetime.timedelta(seconds=60*60*9.5)
    time_group = pd.Grouper(freq=bar_size, closed='left', label='right', 
                            base=480)
    foobar = s.groupby(time_group).agg(sum)
    print(foobar)

if __name__ == "__main__":
    main()

产量

2013-01-01 08:00:00    22
2013-01-01 17:30:00     6
Freq: 570T, dtype: int64

在内部,当pd.Grouper给定频率,一个TimeGrouper是返回

In [81]: time_group
Out[81]: <pandas.core.resample.TimeGrouper at 0x7f1499a32198>

因此传递给的参数pd.Grouper实际上传递给pd.TimeGrouper

In [82]: pd.TimeGrouper?
Init signature: pd.TimeGrouper(self, freq='Min', closed=None, label=None,
                               how='mean', nperiods=None, axis=0,
                               fill_method=None, limit=None, loffset=None,
                               kind=None, convention=None, base=0, **kwargs)

TimeGrouper文档不解释base参数,但它的含义相同df.resample

In [83]: df.resample?
Parameters
----------
base : int, default 0
    For frequencies that evenly subdivide 1 day, the "origin" of the
    aggregated intervals. For example, for '5min' frequency, base Could
    range from 0 through 4. Defaults to 0

解决方法

-编辑我注意到我输入的时间不符合我的预期。我将下午12点之后的时间转换为24小时制。但是,unutbu的答案仍然应该清楚。

-第二次编辑。我更改了数据以提供更好的示例。

以下是按日期索引的时间序列。我想从start_datetime开始进行聚合,并根据下面的timedelta(9.5小时= 34200秒)继续进行聚合。

def main():

    # start_datetime = datetime.datetime(2013,1,8)
    # end_datetime = datetime.datetime(2013,5,30)
    s = pd.Series(
        np.arange(2,10),pd.to_datetime([
            '20130101 7:34:04','20130101 8:34:08','20130101 10:34:08','20130101 12:34:15','20130101 13:34:28','20130101 12:34:54','20130101 14:34:55','20130101 17:29:12']))

    print(s)
    bar_size = datetime.timedelta(seconds=60*60*9.5)
    time_group = pd.Grouper(
        freq=pd.Timedelta(bar_size),closed='left',label='right')
    foobar = s.groupby(time_group).agg(np.sum)
    print(foobar)

if __name__ == "__main__":
    main()

运行上面的代码将输出以下内容:

2013-01-01 09:30:00     5
2013-01-01 19:00:00    39
Freq: 570T,dtype: int64

熊猫内部人员决定从午夜而非上午8:00开始分组。我无法找到一种方法来强制数据框在上午8:00开始分组。有人使用熊猫函数有解决方案吗?