处理连续数据

在对连续数据进行如各类滤波、降采样、余弦尖灭、时间微分和积分等连续时间信号的处理时,对单个文件处理再拼接使用会产生数据的不连续。使用 collection 类进行连续数据的处理能够解决这些操作的连续性问题。

Collection类

Collection 类用于存放属于同一次采集的连续数据,它保存连续数据文件路径的列表 flist 和每个文件的起始时间 ftime,以及该采集的元数据信息,包括信道数 nch 、道间距 dx 、标距长度 gauge_length 、采样率 fs 、单个文件的采样点数 nt 和单个文件的时长 flength 。在初始化一个类实例时,在默认情况下,会读取第二个数据文件的元数据以获取所有元数据信息,并根据第二个数据的开始时间 start_time 自动计算每个文件的起始时间 ftime

>>> from daspy import Collection
>>> coll = Collection('data/*.h5')
>>> coll
       flist: 2608 files
              [data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312132304.h5,
               data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312132305.h5,
               ...,
               data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312151831.h5]
       ftime: 2023-12-13 23:04:00.558582+00:00 to 2023-12-15 18:32:00.558582+00:00
     flength: 60.0
         nch: 1956
          nt: 12000
          dx: 1.022494912147522
          fs: 200.0
gauge_length: 4.0
  • 设置 meta_from_file='all' 以读取每个文件的元数据,DASPy会检查所有元数据是否一致、数据是否连续,并保存和计算所需的属性。各类元数据也支持直接指定。对于大量的连续数据,该方法非常耗时。

  • 设置 timeinfo_format 可以从文件名中得到起始时间,并检查连续性并计算 flengthtimeinfo_format='DAS_%Y-%m-%dT%H:%M:%S%z.h5' 表示文件名对应的时间, timeinfo_format=(slice(33:45), '%Y%m%d%H%M%S') 表示文件名的切片对应的时间。

数据选择

Collection 类中选择某个时间段的数据:

>>> from daspy import DASDateTime
>>> coll.select(stime = DASDateTime(2023, 12, 14, 12), etime=DASDateTime(2023, 12, 14, 13))
       flist: 61 files
              [data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312141159.h5,
               data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312141200.h5,
               ...,
               data/TEST_2000m_4m_1_5000Hz_200Hz_UTC8_202312141259.h5]
       ftime: 2023-12-13 23:04:00.558582+00:00 to 2023-12-15 18:32:00.558582+00:00
     flength: 60.0
         nch: 1956
          nt: 12000
          dx: 1.022494912147522
          fs: 200.0
gauge_length: 4.0

设置 readsec=True 将直接读取所需时段的数据为 Section 类实例并返回。

连续数据处理

Collection.process 方法能够将所有文件依次读取为 Section 类实例,进行所需要的一系列处理后添加后缀并保存至目标目录。该方法会通过缓存滤波器状态等办法来解决数据不连续性。一个将所有数据低通滤波并在时间和空间域都降采样5倍,再进行积分的例子:

>>> operations = [['downsampling', dict(tint=5, xint=5, lowpass_filter=True)],
                  ['time_integration', dict()]]
>>> coll.process(operations, savepath='../processed', suffix='_pro')