You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用pd.Grouper将pandas.DatetimeIndex向下取整至指定时间点(如每日06:00)

复用Grouper实现自定义时间向下取整(每日/每月/每季度/每年06:00)

嗨,刚好可以用你已经定义好的Grouper对象来实现这个需求,而且还能轻松扩展到月、季、年的场景,下面是具体的实现步骤:

基础场景:时间戳向下取整至每日06:00

首先先回顾你的初始代码,创建跨越1.5天的小时级DatetimeIndex:

import pandas as pd
i = pd.date_range('2022-01-01', freq='H', periods=36)

你已经定义了用于聚合的Grouper:

gr = pd.Grouper(freq='D', offset=pd.Timedelta(hours=6))

要复用这个Grouper实现向下取整,只需要调用它的get_grouper方法,获取对应的分组键——这就是我们想要的取整后的时间戳:

floor_to_6am_daily = gr.get_grouper(i, sort=False).keys

运行后得到的结果正好符合你的期望:把每个时间戳映射到最近的当日06:00(如果时间早于当日06:00,则映射到前一天的06:00)。

扩展场景:取整至月/季/年第一天的06:00

只需要修改Grouper的freq参数,保持offset不变,就能轻松实现其他时间粒度的取整:

1. 每月第一天06:00

gr_month = pd.Grouper(freq='MS', offset=pd.Timedelta(hours=6))
floor_to_6am_monthly = gr_month.get_grouper(i, sort=False).keys

这里freq='MS'代表“月初”(Month Start),配合offset会把所有时间戳映射到对应月份第一天的06:00。

2. 每季度第一天06:00

gr_quarter = pd.Grouper(freq='QS', offset=pd.Timedelta(hours=6))
floor_to_6am_quarterly = gr_quarter.get_grouper(i, sort=False).keys

freq='QS'代表“季初”(Quarter Start),结果会是每个时间戳所属季度第一天的06:00。

3. 每年第一天06:00

gr_year = pd.Grouper(freq='AS', offset=pd.Timedelta(hours=6))
floor_to_6am_yearly = gr_year.get_grouper(i, sort=False).keys

freq='AS'代表“年初”(Year Start),结果会是每个时间戳所属年份第一天的06:00。

封装成工具函数(可选)

如果需要频繁复用不同粒度的取整逻辑,可以封装成一个简单的函数:

def floor_to_custom_time(idx: pd.DatetimeIndex, freq: str, offset_hours: int = 6) -> pd.DatetimeIndex:
    """
    将DatetimeIndex向下取整到指定频率的起始时间+偏移小时数
    :param idx: 待处理的DatetimeIndex
    :param freq: pandas时间频率字符串(如'D'=日, 'MS'=月初, 'QS'=季初, 'AS'=年初)
    :param offset_hours: 偏移小时数,默认6点
    :return: 取整后的DatetimeIndex
    """
    gr = pd.Grouper(freq=freq, offset=pd.Timedelta(hours=offset_hours))
    return gr.get_grouper(idx, sort=False).keys

使用示例:

# 每日06:00取整
daily_floor = floor_to_custom_time(i, 'D')
# 每月第一天06:00取整
monthly_floor = floor_to_custom_time(i, 'MS')

原理说明

pd.Grouper的get_grouper方法本质上会根据你指定的频率和偏移量,为每个时间戳计算对应的分组标识——这个标识刚好就是我们需要的“向下取整”后的时间值,完美复用了你在聚合场景中已经使用的逻辑,不需要额外编写自定义的取整函数。

内容的提问来源于stack exchange,提问作者ElRudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:13:13