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

Python:计算时间序列对应计时器起始后小时数的问题求解

时间序列数据对齐与DataFrame生成优化方案

问题描述

我有一组每5分钟记录一次、重叠时长为2.5分钟的时间序列数据,已知记录起始时间戳和计时器起始时间戳,需计算从计时器启动到记录结束的总时长,并生成包含记录值与对应所属计时器启动后小时数的DataFrame(示例如下)。目前已用Python实现逻辑,但怀疑数据存在对齐问题,希望找到更优实现方法。

示例输出表格

recordinghours from chronometer start
0.2620
0.2430
0.2630
0.3421
0.7651
0.1111
......

当前实现代码

import numpy as np
import pandas as pd
from math import floor

recordings = list(np.random.rand(1000)) # 示例记录数据

chronometer_start = 1670000000 # 计时器起始时间戳
start_recording = 1673280570 # 记录起始时间戳
gap_in_seconds = start_recording - chronometer_start

# 计算计时器启动到开始记录之间需要填充的空记录数
gap_in_n_records = round(gap_in_seconds / 60 / 2.5)

# 填充空值
recordings = [np.nan for _ in range(gap_in_n_records)] + recordings 

# 计算每条记录对应的累计分钟数
minutes = [5] # 第一条记录无重叠,时长5分钟
for _ in range(len(recordings)-1):
    minutes += [minutes[-1]+2.5]
hours = pd.Series(minutes).apply(lambda x: floor(x/60))

df = pd.DataFrame({
    'recording' : recordings,
    'hour' : hours
})

优化方案

问题分析

原实现的核心问题在于:

  • 循环生成minutes序列效率低下,记录量较大时性能劣势明显
  • 用round处理时间差易引发对齐误差,依赖记录数推导时间的逻辑不够严谨

优化代码

import numpy as np
import pandas as pd

# 示例数据
recordings = np.random.rand(1000)
chronometer_start = pd.Timestamp(1670000000, unit='s')
start_recording = pd.Timestamp(1673280570, unit='s')

# 1. 生成每条记录的结束时间戳:第一条记录结束于启动记录后5分钟,后续每条间隔2.5分钟(重叠2.5分钟,步长为5-2.5)
record_end_times = pd.date_range(
    start=start_recording + pd.Timedelta(minutes=5),
    periods=len(recordings),
    freq='2.5min'
)

# 2. 计算每条记录结束时,距离计时器启动的小时数(向下取整)
hours_from_start = (record_end_times - chronometer_start).total_seconds() / 3600
hours_floor = hours_from_start.astype(int)

# 3. 处理计时器启动到首次记录之间的空记录
first_recording_start = start_recording
pre_gap_duration = first_recording_start - chronometer_start
pre_gap_count = int(pre_gap_duration.total_seconds() / (2.5*60))

# 生成空记录对应的小时数
pre_hours = pd.Series(
    [(pd.Timedelta(minutes=2.5*i + 5) - chronometer_start).total_seconds()/3600 
     for i in range(pre_gap_count)]
).astype(int)
pre_recordings = [np.nan]*pre_gap_count

# 合并数据生成最终DataFrame
final_recordings = np.concatenate([pre_recordings, recordings])
final_hours = np.concatenate([pre_hours, hours_floor])

df = pd.DataFrame({
    'recording': final_recordings,
    'hours from chronometer start': final_hours
})

# 计算总时长
total_duration = (record_end_times[-1] - chronometer_start).total_seconds() / 3600
print(f"计时器启动到记录结束总时长:{total_duration:.2f}小时")

优化点说明

  • 用pandas.date_range直接生成精准时间序列,替代循环逻辑,效率大幅提升
  • 基于实际时间戳计算小时数,彻底消除记录数推导带来的对齐误差
  • 明确区分记录的开始/结束时间,逻辑更清晰易懂
  • 总时长通过最后一条记录结束时间与计时器起始时间直接计算,结果精准可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:11:21