如何为时间序列每10个数据点应用自定义函数并生成10分钟间隔DataFrame
时间序列按10分钟间隔应用自定义函数的实现方案
需求说明
现有1分钟频率的时间序列数据,需按每10个数据点(即10分钟间隔)为一组,将每组以形状(10,)的数组传入自定义函数计算,最终将结果存入带10分钟间隔索引的DataFrame中。
实现方法
方法一:使用Pandas resample 方法
resample是Pandas处理时间序列分组的原生方法,能直接按时间间隔分组并应用自定义函数:
import pandas as pd import numpy as np # 生成原始1分钟间隔时间序列数据 df = pd.DataFrame(index=pd.date_range(freq='1T', start='2020-10-10', periods=12*24)) df['value'] = np.random.randint(1, 100, size=df.shape[0]) # 自定义计算函数 def func(arr, b, c): return np.mean(arr) * b - c # 若原始数据总点数不是10的整数倍,先截断处理(可选) truncated_len = len(df) // 10 * 10 df = df.iloc[:truncated_len] # 按10分钟重采样,对每组数据应用自定义函数 result_df = df['value'].resample('10T').apply(lambda x: func(x.values, b=3, c=5)) # 转换为带列名的DataFrame result_df = result_df.to_frame(name='calculated_value') # 查看结果 print(result_df.head())
说明:
resample('10T')自动将1分钟数据按10分钟窗口分组,每组对应10个原始数据点x.values提取每组的数值数组,形状为(10,),完全匹配自定义函数的输入要求- 结果DataFrame的索引为每个10分钟窗口的起始时间
方法二:使用Numpy数组拆分 + 手动构建索引
若偏好更底层的数组操作,可直接拆分原始数组后计算:
import pandas as pd import numpy as np # 生成原始数据 df = pd.DataFrame(index=pd.date_range(freq='1T', start='2020-10-10', periods=12*24)) df['value'] = np.random.randint(1, 100, size=df.shape[0]) # 自定义计算函数 def func(arr, b, c): return np.mean(arr) * b - c # 截断数据到10的整数倍长度 truncated_len = len(df) // 10 * 10 df = df.iloc[:truncated_len] # 将原始数值数组拆分为每10个一组的二维数组 grouped_arrays = df['value'].values.reshape(-1, 10) # 遍历每组应用自定义函数 calculated_values = [func(arr, 3, 5) for arr in grouped_arrays] # 构建10分钟间隔的索引(取每组第一个数据点的时间戳) new_index = df.index[::10] # 创建结果DataFrame result_df = pd.DataFrame({'calculated_value': calculated_values}, index=new_index) # 查看结果 print(result_df.head())
说明:
reshape(-1,10)将一维数值数组拆分为N行10列的二维数组,每行对应一组10个数据点- 索引通过取原始索引的第0、10、20...个元素生成,确保与10分钟间隔对齐
内容的提问来源于stack exchange,提问作者prof32
相关产品推荐
相关产品推荐

