如何使用openpyxl库从Excel中获取时间序列数据?

时间:2019-11-27 08:36:52

标签: python excel openpyxl

我正在读取Excel文件,该文件每8秒更新一次传感器数据并将其保存在auto.in中

我正在阅读的Excel工作表包含:

  • 列号2是hh:mm:ss
  • 中的时间
  • 列号3是湿度
  • 列号4是传感器1的温度值
  • 列号5是压力值
  • 列号6是传感器2的温度值。

我正在使用以下代码来获取时间序列数据:

import matplotlib.pyplot as plt
import time
import numpy as np
from openpyxl import load_workbook
import tkinter
import matplotlib.gridspec as gridspec

wb = load_workbook('PLX_DAQ.xlsm')
sheet_1 = wb.get_sheet_by_name('Simple Data')

plt.figure(figsize=(6, 4), facecolor='Grey')
G = gridspec.GridSpec(6, 2)

x = np.zeros(sheet_1.max_row)
y = np.zeros(len(x))
z = np.zeros(len(x))
a = np.zeros(len(x))
b = np.zeros(len(x))

for i in range(1, sheet_1.max_row): 

    x[i] = sheet_1.cell(row=i + 1, column=2).value
    y[i] = sheet_1.cell(row=i + 1, column=3).value
    z[i] = sheet_1.cell(row=i + 1, column=4).value
    a[i] = sheet_1.cell(row=i + 1, column=5).value
    b[i] = sheet_1.cell(row=i + 1, column=6).value
    plt.ion()

list1 = []
list2 = []
list3 = []
list4 = []
list5 = []

for i in range(0,len(x)):
    list1.append(x[i])
    list2.append(y[i])
    list3.append(z[i])
    list4.append(a[i])
    list5.append(b[i])

    time.sleep(8)
    plt.scatter(list1, list2, color='cyan', label='Humidity')
    plt.scatter(list1, list3, color='red', label='Temprature1')
    plt.scatter(list1, list4, color='yellow', label='Pressure')
    plt.scatter(list1, list5, color='green', label='Temprature2')
    plt.grid(True)
    plt.pause(0.5) 
  

这给了我以下错误,

runfile('C:/Users/tejas.a.patel/Desktop/Pythonpractice/Spyder/Read Excel_PLX-DAQ live plot-a.py', 
wdir='C:/Users/tejas.a.patel/Desktop/Pythonpractice/Spyder')
C:/Users/tejas.a.patel/Desktop/Pythonpractice/Spyder/Read Excel_PLX-DAQ live plot-a.py:19: 
DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
sheet_1 = wb.get_sheet_by_name('Simple Data')

Traceback (most recent call last):
File "<ipython-input-1-f101b726f4c2>", line 1, in <module> runfile('C:/Users/tejas.a.patel/Desktop/Pythonpractice/Spyder/Read Excel_PLX-DAQ live plot-a.py', 
wdir='C:/Users/tejas.a.patel/Desktop/Pythonpractice/Spyder')
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/tejas.a.patel/Desktop/Pythonpractice/Spyder/Read Excel_PLX-DAQ live plot-a.py", line 35, in <module>
x[i] = sheet_1.cell(row=i + 1, column=2).value
TypeError: float() argument must be a string or a number, not 'datetime.time'

请帮助

1 个答案:

答案 0 :(得分:1)

问题在于您已将变量初始化为float:

x = np.zeros(sheet_1.max_row)
y = np.zeros(len(x))
z = np.zeros(len(x))
a = np.zeros(len(x))
b = np.zeros(len(x))

检查方式:

x.dtype

您会得到

dtype('float64')

现在您正在尝试将Python datetime.time对象分配给该变量,这就是它引发异常的原因。 我不知道您为什么要使用x,y,z等,然后在列表list1,list2,list3 ..中附加内容。在这里您可以直接附加值。

无论如何,您出于某种原因正在使用,然后一种解决方法是将datetime.time对象转换为秒(或分钟或小时,无论您喜欢什么)然后分配。

time_ = (sheet_1.cell(row=i + 1, column=2).value) # ex08:32:10
time_in_sec = time_.hour*60*60 + time_.minute*60 +time_.second

#print(type(time_))
#print(type(time_.isoformat()))
print(time_in_sec)
x[i] = time_in_sec # assign to variables

有关更多信息,请检查链接: https://docs.python.org/3.4/library/datetime.html?highlight=weekday#time-objects