我正在分析文本文件中的传感器数据,并使用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
答案 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()