【问题标题】:How to find whether a value is occurring in sequence or time order?如何查找一个值是否按顺序或时间顺序出现?
【发布时间】:2020-01-03 20:17:30
【问题描述】:

我在下面给出了两个数据框供您测试

df_1 = pd.DataFrame({
'subject_id':[1,1,1,1,1,1,1,1,1,1,1],
'time_1' :['2173-04-03 10:00:00','2173-04-03 10:15:00','2173-04-03 10:30:00','2173-04-03 10:45:00','2173-04-03 11:01:00','2173-04-04 12:00:00','2173-04-05 16:00:00','2173-04-05 22:00:00','2173-04-06 04:00:00','2173-04-06 04:30:00','2173-04-06 06:30:00'],
'val' :[5,5,5,5,5,10,5,8,3,8,10]
})

df_2 = pd.DataFrame({
'subject_id':[1,1,1,1,1,1,1,1,1,1,1],
'time_1' :['2173-04-03 10:00:00','2173-04-03 10:15:00','2173-04-03 10:30:00','2173-04-03 10:45:00','2173-04-03 11:01:00','2173-04-04 12:00:00','2173-04-05 16:00:00','2173-04-05 22:00:00','2173-04-06 04:00:00','2173-04-06 04:30:00','2173-04-06 06:30:00'],
'val' :[5,6,5,6,5,10,5,8,3,8,10]
 })

我正在尝试查找val中的值是否按顺序(时间顺序)。我的意思是一个值出现时没有中断(例如:5,5,5 是一个序列(时间顺序),而 5,6,5,6 是 5 序列被中断的示例)。你能帮我找到吗?

这是我尝试了一些 cumsum 和 duration 但它不起作用

df['time_1']= pd.to_datetime(df1['time_1'])
s=pd.to_timedelta(24,unit='h')-(df.time_1-df.time_1.dt.normalize())
df['tdiff'] = 
df.groupby(df.time_1.dt.date).time_1.diff().shift(-1).fillna(s)
df['t_d'] = df['tdiff'].dt.total_seconds()/3600
df['date'] = df['time_1'].dt.date
df.groupby(['val','date'],sort=False)['t_d'].agg({'cumduration':sum,'freq':'count'}).reset_index()

我希望我的 df_2 输出是这样的。

【问题讨论】:

    标签: python python-3.x pandas datetime python-datetime


    【解决方案1】:

    你的开销有点太大了。将这些步骤填充到一行命令中:

    1. 将 ["val"] 向左移一位 ...
    2. ... 用 将该移位序列与 ["val"] 进行比较
    3. 这为您提供了一系列布尔值;对此应用all()

    all() 的结果告诉你它们是否在非降序中。

    编码留给读者作为练习。 :-)

    【讨论】:

    • 第二步,为什么我们必须使用<=,如果我检查它们是否相同,不应该只是=吗?只是想学习
    • 您要求查找它们是否按顺序排列,而不是它们是否相同。此外,在 Stack Overflow 上已经多次解决了查找匹配值序列的问题,您应该在没有发布新问题的情况下找到了这些解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2010-11-04
    相关资源
    最近更新 更多