【问题标题】:Calculate Mean Values For Every Hour to eliminate peaks and lows计算每小时的平均值以消除高峰和低谷
【发布时间】:2016-12-24 16:07:41
【问题描述】:

我有一个如下所示的日志文件:(日期/时间 - 温度 - 湿度)

2016-05-17 21:17    18.5    39.2
2016-05-17 21:18    18.5    39.2
2016-05-17 21:19    18.6    39.3
2016-05-17 21:20    18.5    39.3
2016-05-17 21:21    18.5    39.3
2016-05-17 21:22    18.4    39.2
2016-05-17 21:23    18.5    39.3
2016-05-17 21:24    18.4    39.3
2016-05-17 21:25    18.5    39.4
2016-05-17 21:26    18.4    39.3
2016-05-17 21:27    18.3    39.4
2016-05-17 21:28    18.3    39.4
2016-05-17 21:29    18.4    39.5
2016-05-17 21:30    4.4 39.5
2016-05-17 21:31    18.4    39.5
2016-05-17 21:32    18.3    39.5
2016-05-17 21:33    18.3    39.5
2016-05-17 21:34    18.3    39.5
2016-05-17 21:35    18.3    39.5
2016-05-17 21:36    18.3    39.6
2016-05-17 21:37    18.3    39.6
2016-05-17 21:38    18.3    39.6
2016-05-17 21:39    18.3    39.6
2016-05-17 21:40    18.3    15.6
2016-05-17 21:41    18.2    39.5

我想消除显示异常峰值和低点(错误测量值)的行。

我的做法:

计算每小时的平均温度和湿度值,然后将这一小时内的每个值与平均值进行比较。如果温度或湿度与平均值相差甚远,则整行都会被踢。

我可以用熊猫做这个吗?

到目前为止,我只设置了 df。

df = pd.read_csv('Logger.csv',delimiter="\t", names =['Timestamp', 'Temperature', 
'Humidity'],header=None, parse_dates=["Timestamp"], index_col="Timestamp").resample('H')
.mean().dropna()

所以我得到了每小时的平均值。

问题:我可以使用 pandas 来比较每行的每个 Temp 和 Hum 值,并消除那些与计算平均值相差 5°C 或 5% 的值吗?

编辑:所以我从日志文件中发布了更多信息,并在 21:30 和 21:40 “添加”了 2 个测量错误。这些测量误差每天发生一到两次,这些是我想要消除的行。 数据通过 Raspberry Pi 和 DHT22 传感器 24/7 全天候记录(传感器存在导致错误测量的错误)

不太确定我是否理解您的问题。我想将好的数据写入一个新的 .csv 文件(good data.csv),将坏数据写入一个不同的新 .csv 文件(baddata.csv) 对不起,如果我把你的问题弄错了。

我想计算日志文件中每 60 分钟的平均值,然后将值逐行与相应小时的平均值进行比较。 对于顶级熊猫给我的日志示例:

                     Temperature  Humidity
Timestamp                                 
2016-05-17 21:00:00        17.82    38.464

所以我清理日志的想法是将日期 2016-05-17 和 21:00 - 22:00 小时内的每个温度值与 17.82°C 进行比较。 我想对湿度做同样的事情。

而这整个过程每一天每一小时都在日志文件中。

如果我没有说得足够清楚,我很抱歉。

@Kyle:我想我可以稍微调整一下这种差异。也许 5°C 有点窄,但我认为 10°C 可以完成这项工作,也许 10% 湿度。 日志是在一个封闭的车库中拍摄的,我认为帽子应该可以工作。测量误差我想摆脱常规测量值的相当大的豁免。 @MaxU: 所以我尝试了代码,但它没有用,我用它来理解语法,这就是我最终得到的:

logfile =pd.read_csv('/Users/Peter/Desktop/LearnPython/DataLoggerTEST.csv',header=None, delimiter="\t",names['Timestamp','Temperature','Humidity'],index_col=0,parse_dates='Timestamp')

df=[logfile[['Temperature','Humidity']].groupby(pd.TimeGrouper('1H')).transform('mean').abs().query('Temperature > 5 and Humidity > 5').index]

我得到的只是每小时的mean 值 输出是(提取):

Date/Time                                 
2016-05-17 21:17:00        17.82    38.464
2016-05-17 21:18:00        17.82    38.464
2016-05-17 21:19:00        17.82    38.464
2016-05-17 21:20:00        17.82    38.464
2016-05-17 21:21:00        17.82    38.464
2016-05-17 21:22:00        17.82    38.464
2016-05-17 21:23:00        17.82    38.464
2016-05-17 21:24:00        17.82    38.464
2016-05-17 21:25:00        17.82    38.464
2016-05-17 21:26:00        17.82    38.464
2016-05-17 21:27:00        17.82    38.464

似乎我应该得到mean 值和实际值之间绝对差异的部分不起作用

【问题讨论】:

  • 你能发布更大的样本 DF 和所需的 DF 吗?是要过滤原始DF还是重采样后?
  • eliminate those values that are 5°C or 5% off the calculated mean - 你的意思是整个 DF 的全局 mean 吗?
  • 您需要确定可接受的方差,如果记录超出可接受的方差,您可以将其写入不良数据

标签: python-3.x pandas logging


【解决方案1】:

我不确定这是最漂亮/最优雅的解决方案,但它应该可以完成工作:

代码:

df.ix[(df[['Temp','Hum']]
       -
       df.groupby(pd.TimeGrouper('1H', key='Timestamp')).transform('mean')
      ).abs()
       .query('Temp < 5 and Hum < 5')
       .index
     ]

解决方案:

In [115]: df.ix[(df[['Temp','Hum']]
   .....:        -
   .....:        df.groupby(pd.TimeGrouper('1H', key='Timestamp')).transform('mean')
   .....:       ).abs()
   .....:        .query('Temp < 5 and Hum < 5')
   .....:        .index
   .....:      ]
Out[115]:
             Timestamp  Temp   Hum
0  2016-05-17 20:17:00  18.5  39.2
1  2016-05-17 20:18:00  18.5  39.2
2  2016-05-17 20:19:00  18.6  39.3
3  2016-05-17 20:20:00  18.5  39.3
4  2016-05-17 21:21:00  18.5  39.3
5  2016-05-17 21:22:00  18.4  39.2
6  2016-05-17 21:23:00  18.5  39.3
7  2016-05-17 21:24:00  18.4  39.3
8  2016-05-17 21:25:00  18.5  39.4
9  2016-05-17 21:26:00  18.4  39.3
10 2016-05-17 21:27:00  18.3  39.4
11 2016-05-17 21:28:00  18.3  39.4
12 2016-05-17 21:29:00  18.4  39.5
14 2016-05-17 21:31:00  18.4  39.5
15 2016-05-17 21:32:00  18.3  39.5
16 2016-05-17 21:33:00  18.3  39.5
17 2016-05-17 21:34:00  18.3  39.5
18 2016-05-17 21:35:00  18.3  39.5
19 2016-05-17 21:36:00  18.3  39.6
20 2016-05-17 21:37:00  18.3  39.6
21 2016-05-17 21:38:00  18.3  39.6
22 2016-05-17 21:39:00  18.3  39.6
24 2016-05-17 21:41:00  18.2  39.5

解释:下面的表达式将给出实际值和平均值(对应小时)之间的绝对差:

In [119]: (df[['Temp','Hum']]
   .....:  -
   .....:  df.groupby(pd.TimeGrouper('1H', key='Timestamp')).transform('mean')
   .....: ).abs()
Out[119]:
         Temp        Hum
0    0.025000   0.050000
1    0.025000   0.050000
2    0.075000   0.050000
3    0.025000   0.050000
4    0.814286   0.985714
5    0.714286   0.885714
6    0.814286   0.985714
7    0.714286   0.985714
8    0.814286   1.085714
9    0.714286   0.985714
10   0.614286   1.085714
11   0.614286   1.085714
12   0.714286   1.185714
13  13.285714   1.185714
14   0.714286   1.185714
15   0.614286   1.185714
16   0.614286   1.185714
17   0.614286   1.185714
18   0.614286   1.185714
19   0.614286   1.285714
20   0.614286   1.285714
21   0.614286   1.285714
22   0.614286   1.285714
23   0.614286  22.714286
24   0.514286   1.185714

数据:

In [116]: df
Out[116]:
             Timestamp  Temp   Hum
0  2016-05-17 20:17:00  18.5  39.2
1  2016-05-17 20:18:00  18.5  39.2
2  2016-05-17 20:19:00  18.6  39.3
3  2016-05-17 20:20:00  18.5  39.3
4  2016-05-17 21:21:00  18.5  39.3
5  2016-05-17 21:22:00  18.4  39.2
6  2016-05-17 21:23:00  18.5  39.3
7  2016-05-17 21:24:00  18.4  39.3
8  2016-05-17 21:25:00  18.5  39.4
9  2016-05-17 21:26:00  18.4  39.3
10 2016-05-17 21:27:00  18.3  39.4
11 2016-05-17 21:28:00  18.3  39.4
12 2016-05-17 21:29:00  18.4  39.5
13 2016-05-17 21:30:00   4.4  39.5
14 2016-05-17 21:31:00  18.4  39.5
15 2016-05-17 21:32:00  18.3  39.5
16 2016-05-17 21:33:00  18.3  39.5
17 2016-05-17 21:34:00  18.3  39.5
18 2016-05-17 21:35:00  18.3  39.5
19 2016-05-17 21:36:00  18.3  39.6
20 2016-05-17 21:37:00  18.3  39.6
21 2016-05-17 21:38:00  18.3  39.6
22 2016-05-17 21:39:00  18.3  39.6
23 2016-05-17 21:40:00  18.3  15.6
24 2016-05-17 21:41:00  18.2  39.5

PS 我特意编辑了前 3 行,所以分组时我们至少有两个小时的数据:

In [117]: df.groupby(pd.TimeGrouper('1H', key='Timestamp')).mean()
Out[117]:
                          Temp        Hum
Timestamp
2016-05-17 20:00:00  18.525000  39.250000
2016-05-17 21:00:00  17.685714  38.314286

【讨论】:

  • 我无法让它工作,因为我正在为你编写代码的方式而苦苦挣扎,但我想这就是我正在寻找的 :-) 我得稍微玩一下看看它是否有效。它在python 3中吗?我收到括号错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多