【问题标题】:How to Join two separate text data files and align data over varying time intervals and avg如何连接两个单独的文本数据文件并在不同的时间间隔和平均值上对齐数据
【发布时间】:2014-09-15 04:02:10
【问题描述】:

我有两个来自两个不同仪器的文本数据文件。一种是以 7 分钟和 8 分钟为间隔升降的电梯。我需要将一台仪器的数据与上下位置时间(持续时间 7 或 8 分钟)的数据进行匹配(对齐)。以下是仪器(Picarro)和升降机(AEM)的数据:

一个问题:Picarro 时间是以 UTC 时间记录的,所以它实际上是下午 6 点,而不是午夜,而 AEM 是从午夜开始的。

Loc_Strt 值表示位置 Upper (364) 或 Lower (233)。

乐器(Picarro)

Date            Time            NH3_Raw              
2014-06-24      00:00:01.134    3.3844673297E+000  
2014-06-24      00:00:03.210    3.1585870007E+000 
2014-06-24      00:00:05.293    3.2442662514E+000
2014-06-24      00:00:06.812    3.2442662514E+000
2014-06-24      00:00:08.335    3.1064987772E+000`

电梯(AEM)

TIMESTAMP, RECORD, Loc_Strt, Loc_Cut
"2014-06-24 00:15:22.6",798,233.8,215
"2014-06-24 00:23:22",799,364,378.8
"2014-06-24 00:30:22.5",800,233.7,215.4
"2014-06-24 00:37:21.9",801,364.7,378.8
"2014-06-24 00:45:22.5",802,233.8,215.4

我希望能够将这两个单独的文件合并并输出到一个新列表中。从这个新列表中,我想对数据执行统计分析、平均值、标准差等。但首先我必须在这些时间范围内调整数据。 AEM 的间隔模式似乎是 7、8、8、7 分钟,然后重复,因此需要创建一些我假设的循环,但远远超出了我的 Python 技能。我想沿着这个模式创建间隔来证实数据。

【问题讨论】:

  • 如何将日期与它们之间的 6 天对齐?是否要根据日期对值进行排序?
  • 文件来自同一日期。我错误地输入了错误的日期。我现在已经编辑了。
  • 那么,您想按时间点对它们进行排序吗?
  • 是的。我想在电梯(AEM)的时间间隔内平均所有 Picarro 数据。我在两个高度(上和下)测量气体浓度,233 = 下和 378 = 上。例如,Picarro 连续测量并记录一个数据点 ~ 2/秒。我需要平均 Picarro 数据在每个高度上花费的时间,上和下。下(7分钟),上(8分钟),下(8分钟),上(7分钟),这是每30分钟循环一次,然后循环重复。 21-22秒是电梯移动到对面高度的行程时间。我想你可以四舍五入到整分钟。

标签: python parsing python-2.7 datetime pandas


【解决方案1】:

这是您可以使用的一种方法:

import re
from datetime import datetime, timedelta
# Custom classes to hold your data.
class ElevatorInterval(object):
    def __init__(self, timestamp, record, loc_strt, loc_cut):
        timestamp = datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S") 
        self.timestop = self.timestart = timestamp + timedelta(hours=6) #UTC+6
        self.measures = []
        self.location = 'bottom' if float(loc_strt) < 300 else 'top'
class NH3Measure(object):
    def __init__(self, date, tim, nh3_raw):
        self.timestamp = datetime.strptime(date + tim, "%Y-%m-%d%H:%M:%S")
        self.nh3 = nh3_raw
    def __repr__(self):
        return str(self.nh3)
# Read data from file and assign them to elevator measures, and NH3 measures.
ele_intervals, nh3_measures = [], []
with open('aem.txt', 'r') as f:
    for line in f:
        linematch = re.match(r'^"([0-9-]+\s[0-9:]+)(?:\.[0-9])?",([0-9]+),([0-9.]+),([0-9.]+)', line)
        if linematch:
            ele_intervals.append(ElevatorInterval(*linematch.groups()))
            if len(ele_intervals) > 1: # Set timestop for the last elevator interval.
                ele_intervals[-2].timestop = ele_intervals[-1].timestart - timedelta(seconds=22)
del ele_intervals[-1] # Remove last interval as it has no stop time.
with open('pic.txt', 'r') as f:
    for line in f:
        linematch = re.match(r'^([0-9-]+)\s+([0-9:]+)[0-9.]*\s+([0-9E.+]+)', line)
        if linematch: nh3_measures.append(NH3Measure(*linematch.groups()))
# Assign NH3 measures to their proper interval, and output the intervals.
for ele in ele_intervals:
    ele.measures = filter(lambda x: ele.timestart < x.timestamp < ele.timestop, nh3_measures)
    print ele.location, ele.measures

使用样本输入,aem.txt

TIMESTAMP, RECORD, Loc_Strt, Loc_Cut
"2014-06-23 18:15:22.6",798,233.8,215
"2014-06-23 18:23:22",799,364,378.8
"2014-06-23 18:30:22.5",800,233.7,215.4
"2014-06-23 18:37:22.5",801,364,378.8

还有pic.txt

Date            Time            NH3_Raw              
2014-06-24      00:16:39.134    3.3844673297E+000  
2014-06-24      00:16:41.210    3.1585870007E+000 
2014-06-24      00:16:43.293    3.2442662514E+000
2014-06-24      00:24:45.293    4.2442662514E+000
2014-06-24      00:24:47.812    4.4242662514E+000
2014-06-24      00:24:49.335    4.1064987772E+000
2014-06-24      00:31:45.293    3.2442662514E+000
2014-06-24      00:31:47.812    3.2442662514E+000
2014-06-24      00:31:49.335    3.1064987772E+000

打印结果:

bottom [3.3844673297E+000, 3.1585870007E+000, 3.2442662514E+000]
top [4.2442662514E+000, 4.4242662514E+000, 4.1064987772E+000]
bottom [3.2442662514E+000, 3.2442662514E+000, 3.1064987772E+000]

【讨论】:

  • 你在哪里使用'with open('pic.txt', 'r') as f:',我正在尝试使用 pd.read_csv(file, header=0, index_col=0) as f: 但不断收到 exit 属性错误。任何想法为什么? Picarro 文件是固定宽度文件 (fwf),AEM 是 csv。我想使用 pandas,因为它们有简单的模块 read_fwf 和 read_csv 来处理每种文件类型。请帮忙
  • 我对这些模块了解不多,抱歉。也许你应该提出另一个问题。不过你可以试试numpy,太棒了。
  • 我提供的 AEM(电梯)示例文件的列比我在文本中提供的三列多得多。尝试将其导入脚本时,我收到以下错误:init 恰好需要 5 个参数,只有 4 个给定
  • 回溯(最近一次调用最后):文件“C:\Users\Jason\Google Drive\Python Programs\AEM_Picarro_Slice”,第 23 行,在 ele_intervals.append(ElevatorInterval(*linematch. groups())) TypeError: __init__() 正好需要 5 个参数(给定 4 个)
  • 尝试打印linematch.groups()。使用我的代码,它应该返回一个包含 4 个元素的元组。你以某种方式改变了它,所以它只给出了三个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多