首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个时间戳行折叠为单个

将多个时间戳行折叠为单个
EN

Stack Overflow用户
提问于 2021-01-04 19:55:43
回答 1查看 97关注 0票数 2

我有一个类似的系列:

代码语言:javascript
复制
s = pd.DataFrame({'ts': [1, 2, 3, 6, 7, 11, 12, 13]})
s

    ts
0   1
1   2
2   3
3   6
4   7
5   11
6   12
7   13

我想折叠那些差小于MAX_DIFF (2)的行。这意味着所需的输出必须是:

代码语言:javascript
复制
[{'ts_from': 1, 'ts_to': 3},
 {'ts_from': 6, 'ts_to': 7},
 {'ts_from': 11, 'ts_to': 13}]

我做了一些编码:

代码语言:javascript
复制
s['close'] = s.diff().shift(-1)
s['close'] = s[s['close'] > MAX_DIFF].astype('bool')
s['close'].iloc[-1] = True

parts = []
ts_from = None

for _, row in s.iterrows():
    if row['close'] is True:
        part = {'ts_from': ts_from, 'ts_to': row['ts']}
        parts.append(part)
        ts_from = None
        continue
    
    if not ts_from:
        ts_from = row['ts']

这是可行的,但似乎并不是最优的,因为有了iterrow()。我考虑了等级,但不知道如何实现它们,以便进一步按等级分组。

有什么方法可以用运算法则吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 20:03:20

您可以通过检查差异是否大于阈值来创建组,并取一个累积和。然后,不管您喜欢什么,可能是firstlast

代码语言:javascript
复制
gp = s['ts'].diff().abs().ge(2).cumsum().rename(None)
res = s.groupby(gp).agg(ts_from=('ts', 'first'),
                        ts_to=('ts', 'last'))
#   ts_from  ts_to
#0        1      3
#1        6      7
#2       11     13

如果你想要这份清单的话:

代码语言:javascript
复制
res.to_dict('records')
#[{'ts_from': 1, 'ts_to': 3},
# {'ts_from': 6, 'ts_to': 7},
# {'ts_from': 11, 'ts_to': 13}]

为了完整起见,这里是石斑鱼是如何与DataFrame对齐的:

代码语言:javascript
复制
s['gp'] = gp
print(s)

   ts  gp
0   1   0     # `1` becomes ts_from for group 0
1   2   0
2   3   0     # `3` becomes ts_to for group 0
3   6   1     # `6` becomes ts_from for group 1
4   7   1     # `7` becomes ts_to for group 1
5  11   2     # `11` becomes ts_from for group 2
6  12   2
7  13   2     # `13` becomes ts_to for group 2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65568995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档