爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 8750|回复: 0

[源代码] Python解决实际问题:断续不定的监测数据的分段

[复制链接]

新浪微博达人勋

发表于 2021-11-12 09:51:29 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
'''
需求缘起:
工作中,经常遇到粗心的同事,在操作仪器时,把不同项目、不同次的监测数据都放在一起,
再加上预热仪器时的数据、随机查看时的数据,最后搞得我们不知道哪些数据是自己需要的。
于是,我写了一个函数,按采样时间的连续性,把监测数据分成段

'''
import pickle,os
from datetime import datetime,timedelta
import numpy as np

# t是一个datetime格式的ndarray
def division(t):
   
    # 认为时间间隔超过以下值为不同次的监测:
    limit_minutes=30

    # 认为少于该时间长度的监测无效:
    least=timedelta(minutes=30)
   
    # 以下部分是固定不动的:

    # 格式转换:
    t=np.array(t)

    # 排序:
    p=np.argsort(t)
    t=t[p]

    # 时间点个数:
    n=len(t)

    t1=t[0:-1]
    t2=t[1:]
    dt=t2-t1 # 差的序列

    # 找出超过limit_minutes的空隙的位置:
    timegap=timedelta(minutes=limit_minutes)
    p=np.where(dt>timegap)
    p=p[0]
    n=len(p)

    # 断段的开头,也是整段的结尾:
    a=[]

    # 断段的结尾,也是整段的开头:
    b=[]


分段示意图.jpg

    for i in range(n):
        a.append(t1[p[i]])
        b.append(t2[p[i]])


    # a追加t的结尾元素,这样a就是所有整段的结尾时间序列:
    a.append(t[-1])

    # t的开头元素加在b的开头,这样b就是所有整段的开始时间序列:
    c=[t[0]]
    c.extend(b)
    b=c

    n=len(a) # 整段的段数

    # 以下开始做返回值:

    t1=[]       #整段的开头时间
    t2=[]       #整段的结尾时间
    period=[]   #每段的时长

    for i in range(n):
        if (a[i]-b[i])<least:
            continue
        t1.append(b[i])
        t2.append(a[i])
        period.append(a[i]-b[i])

    # 舍去过短的片段后的段数:
    n=len(t1)
   
    #段之间的间隔时间,比t1,t2少一个数:
    gap=[]
    for i in range(n-1):
        gap.append(t1[i+1]-t2[i])

    result={'t1':t1,'t2':t2,'时长':period,'间隔':gap}
    return result




密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表