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

合并60分钟数据集至numpy数组/pandas DataFrame遇阻求助

解决数据集合并与cumsum操作问题

问题根源

numpy数组合并失败

你用ch1_total.append(c)把每个子数组塞进列表,最后得到的是存着多个ndarray的列表,不是合并后的单一数组。

DataFrame只保留最后一组数据

每次循环里df = pd.concat([df1], ignore_index=True)都是用当前的df1覆盖之前的df,相当于每次都重新创建一个只包含当前数据集的DataFrame,自然只剩最后一组。另外你注释掉的df_ch1.append其实是正确的思路,但没用到。

还有个小问题:data1.rolling(12).sum() / 12这行没有赋值,滚动求和的结果根本没保存,等于白跑了。

修正方案

方案1:合并为numpy ndarray

把所有子数组收集到列表后,用np.concatenate合并成单一数组,再做cumsum:

ch1_total = []
for filename, l in zip(filenames, L):
    if ch1:
        cont = np.loadtxt(filename, skiprows=ch1Start, max_rows=ch1N)
        t = cont[:, 0] + TimeOld
        c = cont[:, 1] * ch1M + resetCh1
        # 保存滚动求和结果(如果需要的话)
        c_rolled = pd.Series(c).rolling(12).sum() / 12
        c_rolled = c_rolled.dropna().values  # 去掉滚动产生的NaN
        ch1_total.append(c_rolled)
        resetCh1 = c[-1]

# 合并所有子数组为单一ndarray
ch1_combined = np.concatenate(ch1_total)
# 执行cumsum
ch1_cumsum = ch1_combined.cumsum()

方案2:合并为pandas DataFrame

直接在循环里把每个子DataFrame收集到列表,最后一次性concat(效率更高):

df_list = []
for filename, l in zip(filenames, L):
    if ch1:
        cont = np.loadtxt(filename, skiprows=ch1Start, max_rows=ch1N)
        t = cont[:, 0] + TimeOld
        c = cont[:, 1] * ch1M + resetCh1
        data1 = pd.DataFrame(c, columns=['intensity'])
        # 保存滚动求和结果
        data1 = data1.rolling(12).sum() / 12
        data1 = data1.dropna()  # 去掉NaN
        df_list.append(data1)
        resetCh1 = c[-1]

# 一次性合并所有子DataFrame
df_ch1 = pd.concat(df_list, ignore_index=True)
# 执行cumsum
df_ch1['cumsum_intensity'] = df_ch1['intensity'].cumsum()

关键注意点

  • 滚动求和会产生前11个NaN(因为窗口是12),记得用dropna()清理,或者根据需求保留并处理。
  • 用列表收集所有子数据集后再一次性合并,比循环里每次append/concat效率更高,尤其是数据量大的时候。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:12:16