
本文介绍如何修改基于 timedelta 的时间序列生成逻辑,在每日最后一刻(而非默认的 23:45)自动插入指定时间戳(如 23:59:24),确保每日时间范围完整且可控。
本文介绍如何修改基于 `timedelta` 的时间序列生成逻辑,在每日最后一刻(而非默认的 23:45)自动插入指定时间戳(如 23:59:24),确保每日时间范围完整且可控。
在构建高频时间序列(如每15分钟采样一次)时,原始逻辑按固定步长递增时间,导致每日结束于 23:45:00,而实际业务常需统一截断至特定秒级精度(例如 23:59:24)。直接追加会导致重复或越界,因此需在跨日边界处动态注入自定义时间戳。
核心思路是:预判下一个时间点是否跨日。通过同时维护 current_datetime 和 next_datetime,当二者所属日期不同时,即判定当前为当日最后一个标准时间点,此时插入用户指定的 custom_timestamp(如 23:59:24),并合理排序以避免时间倒序或重复。
以下是推荐的健壮实现(含错误防护与清晰结构):
from datetime import datetime, time, timedelta
def generate_daily_ending_timestamps(
initial: datetime,
final: datetime,
interval: timedelta,
custom_time: time
) -> list[datetime]:
"""
生成带每日自定义结尾时间戳的时间序列。
Args:
initial: 起始时间(含)
final: 结束时间(含)
interval: 时间步长(如 timedelta(minutes=15))
custom_time: 每日强制插入的结尾时间(如 time(23, 59, 24))
Returns:
按时间升序排列的 datetime 列表
"""
if initial > final:
return []
result = []
current = initial
next_dt = initial + interval
while current <= final:
# 判断是否为当日最后一个标准时间点
if next_dt.day != current.day:
# 构造当日自定义结尾时间
custom_dt = datetime.combine(current.date(), custom_time)
# 确保顺序正确:先 current,再 custom_dt(除非 custom_dt 更早)
if custom_dt < current:
result.extend([custom_dt, current])
elif custom_dt > current:
result.extend([current, custom_dt])
else: # 完全相等,只添加一次
result.append(current)
else:
result.append(current)
current = next_dt
next_dt += interval
# 防止无限循环:若 next_dt 已超 final,后续不再生成新点
if current > final:
break
# 最终裁剪:确保所有时间点均 ≤ final
return [dt for dt in result if dt <= final]
# 使用示例
initial_dt = datetime(1996, 11, 21, 0, 0, 0)
final_dt = datetime(2024, 4, 3, 23, 59, 24)
step = timedelta(minutes=15)
end_of_day = time(23, 59, 24)
timestamps = generate_daily_ending_timestamps(
initial_dt, final_dt, step, end_of_day
)
# 验证最后几项(以确认每日结尾正确)
for ts in timestamps[-6:]:
print(ts.strftime("%Y-%m-%d %H:%M:%S"))关键注意事项:
- ✅ 跨日判断精准:使用 .day 属性比 .date() 更高效,且避免时区干扰;
- ✅ 边界安全:显式检查 current <= final 并在循环末尾裁剪结果,杜绝越界;
- ✅ 顺序鲁棒:对 custom_dt 与 current 的大小关系做三路分支,兼容任意自定义时间(如设为 00:00:00 亦可);
- ⚠️ 性能提示:若时间跨度极大(数十年+),建议改用生成器版本(yield)避免内存积压;
- ⚠️ 时区注意:本方案假设所有时间为本地时间或 UTC 一致时区;若涉及时区转换,请先标准化为 datetime 带 tzinfo 对象。
该方案不仅满足“每日末尾插入 23:59:24”的需求,更具备通用性——只需调整 custom_time 参数,即可适配任意业务定义的每日截止时刻。

















