如何从最后一列中剥离浮动,该列由第一列中的名称列出/标记?

2024-06-09 12:49:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我所说的是文本文件中的一系列传感器读数:

Thermometer1 - 22:00 - 72.4
Thermometer1 - 22:01 - 76.0
Thermometer1 - 22:02 - 79.1
Thermometer1 - 22:03 - 75.6
Thermometer1 - 22:04 - 71.2
Thermometer1 - 22:05 - 71.4
Thermometer1 - 22:06 - 69.2
Thermometer1 - 22:07 - 65.2
Thermometer1 - 22:08 - 62.8
Thermometer1 - 22:09 - 61.4
Thermometer1 - 22:10 - 64.0
Thermometer1 - 22:11 - 67.5
Thermometer1 - 22:12 - 69.4
Thermometer2 - 22:01 - 69.5
Thermometer2 - 22:02 - 70.1
Thermometer2 - 22:03 - 71.3
Thermometer2 - 22:04 - 71.5
Thermometer2 - 22:05 - 69.8
Hygrometer1 - 22:04 - 45.2
Hygrometer1 - 22:05 - 45.3
Hygrometer1 - 22:06 - 45.1
Hygrometer2 - 22:04 - 44.4
Hygrometer2 - 22:05 - 43.9
Hygrometer2 - 22:06 - 44.9
Hygrometer2 - 22:07 - 43.8
Hygrometer2 - 22:08 - 42.1

为了清楚起见,我的全部任务是:

  1. 剥离浮子(温度/湿度读数)
  2. 按传感器名称将其分组
  3. 获取每个传感器读数的平均值和标准偏差
  4. 检查平均值/标准偏差是否在限值内
  5. 按照“温度计1不够精确”这句话打印出4的答案

我有一些想法如何做1:我知道'ast'中的literal_eval和'numpy'中的genfromtxt可以给我一个浮动列表。但我不知道如何从1到2,然后我可以在每个传感器上分别执行3到5


Tags: 名称传感器温度平均值读数文本文件湿度温度计
3条回答

您可以使用regex提取浮点数


例如:

from re import search

file = open('file.txt', mode = 'r')

floats = list()

for _ in file.readlines():
    if result := search(r"(\d*\.\d*)", _):
        floats.append(result.group(1))

print(floats)

输出:

['72.4', '76.0', '79.1', '75.6', '71.2', '71.4', '69.2', '65.2', '62.8', '61.4', '64.0', '67.5', '69.4', '69.5', '70.1', '71.3', '71.5', '69.8', '45.2', '45.3', '45.1', '44.4', '43.9', '44.9', '43.8', '42.1']

更新:

你可以这样做来获取字典中的所有信息

from re import search

file = open('file.txt', mode = 'r')

floats = dict()

for _ in file.readlines():
    if result := search(r"(\w+) - (\d+:\d+) - (\d*\.\d*)", _):
        data = {
            'name': result.group(1),
            'time': result.group(2),
            'value': result.group(3),

        }
        if result.group(1) not in floats:
            floats[result.group(1)] = [data]
        else:
            floats[result.group(1)].append(data)

print(floats)

输出:

{'Thermometer1': [{'name': 'Thermometer1', 'time': '22:00', 'value': '72.4'}, {'name': 'Thermometer1', 'time': '22:01', 'value': '76.0'}, {'name': 'Thermometer1', 'time': '22:02', 'value': '79.1'}, {'name': 'Thermometer1', 'time': '22:03', 'value': '75.6'}, {'name': 'Thermometer1', 'time': '22:04', 'value': '71.2'}, {'name': 'Thermometer1', 'time': '22:05', 'value': '71.4'}, {'name': 'Thermometer1', 'time': '22:06', 'value': '69.2'}, {'name': 'Thermometer1', 'time': '22:07', 'value': '65.2'}, {'name': 'Thermometer1', 'time': '22:08', 'value': '62.8'}, {'name': 'Thermometer1', 'time': '22:09', 'value': '61.4'}, {'name': 'Thermometer1', 'time': '22:10', 'value': '64.0'}, {'name': 'Thermometer1', 'time': '22:11', 'value': '67.5'}, {'name': 'Thermometer1', 'time': '22:12', 'value': '69.4'}], 'Thermometer2': [{'name': 'Thermometer2', 'time': '22:01', 'value': '69.5'}, {'name': 'Thermometer2', 'time': '22:02', 'value': '70.1'}, {'name': 'Thermometer2', 'time': '22:03', 'value': '71.3'}, {'name': 'Thermometer2', 'time': '22:04', 'value': '71.5'}, {'name': 'Thermometer2', 'time': '22:05', 'value': '69.8'}], 'Hygrometer1': [{'name': 'Hygrometer1', 'time': '22:04', 'value': '45.2'}, {'name': 'Hygrometer1', 'time': '22:05', 'value': '45.3'}, {'name': 'Hygrometer1', 'time': '22:06', 'value': '45.1'}], 'Hygrometer2': [{'name': 'Hygrometer2', 'time': '22:04', 'value': '44.4'}, {'name': 'Hygrometer2', 'time': '22:05', 'value': '43.9'}, {'name': 'Hygrometer2', 'time': '22:06', 'value': '44.9'}, {'name': 'Hygrometer2', 'time': '22:07', 'value': '43.8'}, {'name': 'Hygrometer2', 'time': '22:08', 'value': '42.1'}]}

您可以使用pandas高效地执行此操作:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: df = pd.read_csv('a.txt', delimiter='-', header=None)

In [4]: df.groupby(0)[[2]].agg([np.mean, np.std])
Out[4]:
                       2
                    mean       std
0
Hygrometer1    45.200000  0.100000
Hygrometer2    43.820000  1.056882
Thermometer1   69.630769  5.397898
Thermometer2   70.440000  0.904434

现在您可以执行数字3&;4根据这一数据

如果不想使用库,请执行以下操作:

我假设您已将文件内容加载到名为data的变量中

sensors = {}
lines = [line for line in data.split('\n') if line] # filter out empty lines
for line in lines: # itterate over each line
    elements = line.split(' ') # split the line by spaces
    sensor_name = elements[0] # the first of the elements is the senosr's name
    value = float(elements[-1]) # the last of the elements is the data
    # add the data to a list in a dict according to the sensor name
    if sensor_name in sensors.keys() 
        sensors[sensor_name].append(value)
    else:
        sensors[sensor_name] = [value]

这将产生一个列表字典,其中键是传感器的名称

相关问题 更多 >