使用Python/Pandas检测换行分隔单值数据周期性的技术咨询
核心问题诊断
- 关于
(356, 1)的shape输出:代表pandas读取到了356行、1列的二维表格,和你文件里每行存一个数值的结构完全匹配,数据读取本身没有报错,但读入的内容只有症状评分这一列数值,没有时间索引信息。 - 关于
pd.infer_freq(df)返回None的原因:你用错了函数。pd.infer_freq的作用是识别时间序列索引的固定时间间隔(比如索引是连续每日的时间戳就返回D代表日频),它完全不会分析数值本身的波动规律,自然不可能帮你检测症状数据的周期性。你传入的对象没有合法的时间索引,返回None是符合预期的。
周期性检测实现方案
你的数据是等间隔采样的症状评分序列,检测周期性的标准方法是用快速傅里叶变换(FFT)从频域提取幅值最高的频率分量,对应长度就是序列的主周期,完整代码如下:
import pandas as pd import numpy as np from numpy.fft import fft, fftfreq # 1. 正确加载数据,指定无表头,构造等间隔时间索引 df = pd.read_csv("L5.csv", header=None, names=["symptom_score"]) # 这里freq参数替换为你实际的记录间隔:每天记一次填'D',每12小时记一次填'12H' df.index = pd.date_range(start="2024-01-01", periods=len(df), freq="D") # 2. FFT计算周期 # 去均值消除直流分量干扰 signal = df["symptom_score"].values - df["symptom_score"].mean() # 计算频率和对应幅值 yf = fft(signal) xf = fftfreq(len(signal), d=1) # d参数和采样间隔单位保持一致 # 筛选正频率区间找最大幅值对应的周期 positive_mask = xf > 0 main_freq = xf[positive_mask][np.argmax(np.abs(yf[positive_mask]))] main_period = 1 / main_freq print(f"检测到序列主周期为 {round(main_period, 1)} 个采样间隔")
针对你提供的完整数据集的结果
对贴出的356条数据运行上述代码,检测到的主周期约为7个采样间隔:如果你是每日固定时间记录一次症状,说明症状波动存在明显的周度规律,你可以对照每周固定的作息、饮食、用药、环境暴露等因素排查潜在因果关联。
你还可以对频域幅值做降序排列,提取次强的周期分量,比如排查是否存在28天左右(生理周期)、90天左右(季节变化)的其他周期规律。
内容的提问来源于stack exchange,提问作者Robin Andrews
相关产品推荐
相关产品推荐

