Pandas,通过对其他列中的数据求和来折叠具有特定时间差的行

pdsfdshx  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(131)

我有一个带有时间点(时间戳)的表,如果两个时间点之间的间隔小于一分钟,我需要对时间增量求和,并更新时间点的日期时间边界。
对于'time_break'小于60的行,我需要以下内容:

  • 将"time_delta"与来自前一行的"time_delta"相加;
  • 用上一行的值"ts_start"更新"ts_start";
  • 计算新的"time_break",使其对于更新的时间点是正确的

输入数据:

df = pd.DataFrame({'ts_start': [1647854644, 1647855323, 1647855454, 1647855521, 1647858807, 1647858858, 1647858970],
                   'ts_end': [1647854699, 1647855421, 1647855521, 1647856205, 1647858810, 1647858958, 1647859020],
                   'time_break': [105.0, 624.0, 33.0, 0.0, 2602.0, 48.0, 12.0],
                   'time_delta': [55, 98, 67, 625, 3, 100, 50]})

预期输出:

df_out = pd.DataFrame({'ts_start': [1647854644, 1647855323, 1647858807],
                   'ts_end': [1647854699, 1647856205, 1647859020],
                   'time_break': [105.0, 624.0, 2602.0],
                   'time_delta': [55, 790, 153]})

但是我知道它运行得很慢,而且它错过了双倍的时间。我认为有可能使用groupby,但是我不能想出一个解决方案。
如有任何帮助,将不胜感激,谢谢!
我试过这个:

for i in range(1, len(df)):
    try:
        if 0 <= df.iloc[i, df.columns.get_loc('time_break')] <= 60:
            df.iloc[i, df.columns.get_loc('time_delta')] += df.iloc[i-1, df.columns.get_loc('time_delta')]
            df.iloc[i, df.columns.get_loc('ts_start')] = df.iloc[i-1, df.columns.get_loc('ts_start')]
            df.iloc[i, df.columns.get_loc('time_break')] = df.iloc[i, df.columns.get_loc('ts_start')] - df.iloc[i-2, df.columns.get_loc('ts_end')]
            df.drop(index=i-1, inplace=True)
            df = df.reset_index(drop=True)
    except IndexError:
        break;

我的输出:enter image description here

bttbmeg0

bttbmeg01#

试试看:

x = (
    df.groupby((df["time_break"] >= 60).cumsum())
    .agg(
        {
            "ts_start": "first",
            "ts_end": "last",
            "time_break": "first",
            "time_delta": "sum",
        }
    )
    .reset_index(drop=True)
)

print(x)

印刷品:

ts_start      ts_end  time_break  time_delta
0  1647854644  1647854699       105.0          55
1  1647855323  1647856205       624.0         790
2  1647858807  1647859020      2602.0         153

相关问题