使用pandas跨午夜分组夜间时段数据并执行统计运算的问题咨询
解决方案
你可以直接通过对时间索引做偏移计算,生成每个数据点所属的夜间时段标签再分组统计,全程不需要新增额外列到原DataFrame,一行逻辑就能适配任意长度的跨天夜间时段:
import pandas as pd import numpy as np def compute_nth_lmax(self, n): # 筛选符合夜间时段的行 night_data = self.df["LAFmax,T"].between_time( self._night_start, self._day_start, include_start=True, include_end=False ) # 计算每个时间点对应的夜间所属起始日期:时间戳减去夜间开始时长,跨天数据会自动归到同一个起始日期 night_group = night_data.index - pd.Timedelta(self._night_start) # 按夜间起始日期分组计算第n大值 nth_lmax = night_data.groupby(night_group.date).apply( lambda x: np.sort(x)[-n] if len(x) >= n else np.nan ).dropna() return nth_lmax
实现逻辑说明
- 核心逻辑是把每个时间戳减去夜间开始的时长,跨天的夜间数据就会被归到同一个日期下:比如22:00开始的夜间,2021-08-18 22:00到2021-08-19 07:00的所有数据,减去22小时之后日期都会变成2021-08-18,刚好对应这个夜间的起始日期
- 完全适配任意长度的夜间时段,不管是9小时、10小时还是其他无法被24整除的时长,都能正确分组
- 不需要修改原DataFrame结构,分组标签为临时生成,性能和resample方案几乎一致
如果需要让返回结果的索引更易读,可以额外增加一行索引格式化逻辑:
# 可选:将索引转为夜间时段的字符串标识 nth_lmax.index = nth_lmax.index.strftime("%Y-%m-%d") + f" {self._night_start} 至次日 {self._day_start}"
内容的提问来源于stack exchange,提问作者thumpercastle
相关产品推荐
相关产品推荐

