Python如何指定频率生成毫秒分辨率等间隔时间戳序列
实现方案
可以直接通过Python标准库完成需求,不需要额外依赖,核心分为三步:解析输入时间、计算采样间隔、生成无累计误差的时间序列,具体实现如下:
标准库实现(无第三方依赖)
- 时间解析使用
datetime.strptime,严格匹配dd/mm/yyyy hh:MM:ss.sss的输入格式,注意格式占位符不要混淆月份%m和分钟%M - 采样间隔计算:频率单位为Hz时,相邻时间戳的间隔为
1000/freq_hz毫秒,直接传入timedelta生成时间差对象 - 时间点生成采用「起始时间+索引*间隔」的方式计算,避免循环累加间隔带来的浮点数累计误差,保证毫秒级精度
from datetime import datetime, timedelta def generate_ms_timestamps(start_str: str, end_str: str, freq_hz: float) -> list[str]: # 匹配输入输出的时间格式 time_fmt = "%d/%m/%Y %H:%M:%S.%f" start_dt = datetime.strptime(start_str, time_fmt) end_dt = datetime.strptime(end_str, time_fmt) # 计算相邻点时间间隔、总采样点数 interval = timedelta(milliseconds=1000 / freq_hz) total_seconds = (end_dt - start_dt).total_seconds() total_points = int(total_seconds * freq_hz) + 1 # 包含起始、结束两个端点 ts_list = [] for idx in range(total_points): current_ts = start_dt + idx * interval # %f默认输出6位微秒,截断后3位得到3位毫秒的标准格式 ts_list.append(current_ts.strftime(time_fmt)[:-3]) return ts_list
简便实现(基于Pandas)
如果日常数据分析环境已经安装Pandas,可以直接用内置的date_range方法生成时间序列,代码更简洁,精度控制更稳定:
import pandas as pd def generate_ms_timestamps_pd(start_str: str, end_str: str, freq_hz: float) -> list[str]: time_fmt = "%d/%m/%Y %H:%M:%S.%f" # 转换为pandas支持的毫秒级频率标识 pd_freq = f"{1000 / freq_hz}L" ts_range = pd.date_range( start=pd.to_datetime(start_str, format=time_fmt), end=pd.to_datetime(end_str, format=time_fmt), freq=pd_freq ) # 格式化输出为指定格式的字符串 return ts_range.strftime(time_fmt).str[:-3].tolist()
使用示例
if __name__ == "__main__": start = "15/03/2024 12:30:00.000" end = "15/03/2024 12:30:01.000" freq = 100 # 100Hz采样,间隔10ms ts_list = generate_ms_timestamps(start, end, freq) print(ts_list) # 输出长度为101,第一个元素为'15/03/2024 12:30:00.000',最后一个为'15/03/2024 12:30:01.000'
注意:如果不需要输出字符串格式的时间戳,直接在代码中保留
datetime/Timestamp对象即可,原生对象支持微秒级精度,完全满足毫秒分辨率的存储要求。
内容的提问来源于stack exchange,提问作者Marioanzas
相关产品推荐
相关产品推荐

