在Python中将一小时的传感器数据划分为10分钟的间隔?

时间:2018-07-18 05:35:29

标签: python sensor counting

我正在分析文本文件中的传感器数据,并使用Python在一个小时内创建激活的传感器的条形图。我很好奇我如何才能将一个小时在X轴上划分为10分钟的间隔,然后计算“ ON”的传感器的数量以及它们的开启次数?然后,我想将此频率除以打开的传感器总数,以便得到一小部分。我创建了一个过滤器,该过滤器仅检查和绘制在上午7点到上午8点之间处于“ ON”状态的传感器的条形图,但是我只是不知道如何将这小时间隔为10分钟。这是我到目前为止尝试过的:

#Import libraries
import collections
import matplotlib.pyplot as plt
from datetime import datetime

#Get user input
file_name = input('Enter File name: ')
file = open(file_name)
#Array of sensors
sensors = []

#Iterate through the file line by line
for line in file:
    words = line.split()
    #This line filters out the sensor data for the required time 
interval
    if (datetime.strptime (words[1][0:7], "%H:%M:%S")) > 
(datetime.strptime ("07:00:00", "%H:%M:%S")) and (datetime.strptime 
(words[1][0:7], "%H:%M:%S")) < (datetime.strptime ("08:00:00", 
"%H:%M:%S")):
        if words[3] == "ON":
            sensors.append(words[2])

count = collections.Counter(sensors)
print(count)

# Plot Graph and Set Y labels and X Labels
plt.bar(range(len(count)),count.values(),align='center')
plt.xticks(range(len(count)),count.keys())
plt.ylabel('Count')
plt.xlabel('Sensors')
plt.title('Motion Sensor Data')
plt.show()

文本文件中的数据如下:

2009-02-02  07:15:16.575809 M35 ON  R1_Bed_to_Toilet begin
2009-02-02  07:15:21.408519 AD1-A   2.82231
2009-02-02  07:15:22.532789 M35 OFF
2009-02-02  07:15:23.345479 M35 ON
2009-02-02  07:15:27.529299 AD1-A   2.79926
2009-02-02  07:15:28.655329 M34 ON
2009-02-02  07:15:32.57429  M34 OFF
2009-02-02  07:15:32.739629 M35 OFF
2009-02-02  07:15:32.931449 M34 OFF
2009-02-02  07:15:33.07573  M35 OFF

2 个答案:

答案 0 :(得分:0)

函数 mapTime 获取数据时间并映射到最后一分钟间隔参数(在您的情况下为10)。我按照您说的格式读取了文件。

import datetime
import time

def mapTime(dt , interval):
    ts = time.mktime(dt.timetuple())
    newTime = ts - ((dt.minute % interval) * 60) - dt.second
    return datetime.datetime.fromtimestamp(
        int(newTime)
    ).strftime('%Y-%m-%d %H:%M:%S')


f = open('data', 'r')


temp = ''
for line in f.readlines():
    temp = line.split()
    dt = datetime.datetime.strptime(temp[0] + ' ' + temp[1].split('.')[0] , '%Y-%m-%d %H:%M:%S')
    print mapTime(dt, 10)
mapTime函数输出的

示例

2009-02-02 07:14:22 --> 2009-02-02 07:10:00
2009-02-02 07:22:09 --> 2009-02-02 07:20:00
2009-02-02 07:59:59 --> 2009-02-02 07:50:00

答案 1 :(得分:0)

猜想您要每10分钟计算一次“ ON”状态。您应该尝试使用resample熊猫方法。

首先将文件读入数据框并创建DatetimeIndex:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv(filename,header=None,sep=' ')
df.index = pd.to_datetime(df.iloc[:,0]+df.iloc[:,1],format='%Y-%m-%d%H:%M:%S.%f')

然后使用resample进行计数。由于您仅提供了几秒钟的数据,因此每10秒计数一次。如果要数10分钟,则将其更改为600:

count = (df.iloc[:,3]=='ON').astype(int)
sensor_list = pd.unique(df.iloc[:,2])
statistics = pd.DataFrame({sensor:count[df.iloc[:,2]==sensor for sensor in sensor_list].resample('10S').sum()})
statistics = statistics.fillna(0)

# plotting the first 10S:
statistics.iloc[0].plot(kind='bar')
plt.show()