木星笔记本太阳能项目

按时工作

上面链接的Jupyter笔记本包含一些代码示例,用于演示在Python中处理时间信息的基本机制。

比利时太阳能公司的例子

今天的主要示例是将来自几个不同来源的时间序列数据合并到一个数据库表中,然后读取其中的一些数据来构建一个图。

该数据集涉及比利时一家公用事业公司公布的电力输出数据。该公司跟踪整个比利时并网太阳能发电装置的输出,并以CSV文件的形式发布每月的电力生产摘要。我们将把电力生产数据与从Dark Sky下载的天气数据整合到一个数据库表中。然后,我们将构建一个程序,使用这些数据来构建三天内的发电量、云量和温度图。

构建数据库的第一步是使用SQLite Studio构建数据库和表。数据库文件名为“solar.db”,它包含一个名为“power”的表。功率表有如下结构:

类型 描述
时间 INT UNIX时间值
权力 真正的 发电量以兆瓦为单位
临时 真正的 温度(F)
真正的 云层

向数据库中填充数据的过程包括两个步骤:从CSV文件读取电力生产数据,并从Dark Sky获取天气数据。

下面是第一个函数的源代码,该函数从CSV文件加载初始数据。

import sqlite3 import time def cleanLine(line): ““”将原始行列表转换为适当的数据格式。”return (int(time.mktime(time. mktime))strptime(line[0],"%d/%m/%Y %H:% m ")), float(line[1])) def readData(fileName): "“”通用数据读取函数。使用cleanLine对数据行进行格式化。“” data = [] with open(fileName) as f: for line in f.r readlines(): data.append(cleanLine(line.split(',')))) return data reads = readData("Belgium.csv") conn = sqlite3.connect('solar.db') c = conn.cursor() print(" open database successfully") for reading in reading: c.e execute("INSERT INTO power(time,power) VALUES (?,?)",reading) conn.commit() print("Records created successfully") conn.close()

这里有两点值得注意。首先是cleanLine函数中的逻辑。CSV文件中的典型行如下所示

01/04/2019 11:30, 2135.91

由于我们要将时间值存储为UNIX时间数字,因此必须使用time.strptime()函数将文本时间信息转换为时间值。的代码

time.mktime(时间。strptime([0]行,”H % d / Y % m / % %: % m”))

处理好这一步。还要注意,cleanLine()函数将CSV文件中的每行转换为包含两个条目的元组,一个是时间值,一个是功率值。当我们将数据插入数据库时,这种结构将是必需的。

从CSV文件读取数据后,我们将得到一长串元组。为了自动化将赢博体育这些元组插入数据库的过程,我们使用游标execute方法的一个变体。这种变体使用包含占位符的SQL字符串?字符。第二个要执行的参数是一个元组,其中包含要替换占位符的值。

c.execute("INSERT INTO power(time,power) VALUES (?,?)",reading)

准备数据库的第二步是加载天气数据。我们将从Dark Sky下载此天气数据,并通过使用SQL更新命令的循环将温度和云量数据插入数据库。

import sqlite3 import requests import time #设置数据库连接conn = sqlite3.connect('solar.db') c = conn.cursor() print(" open database successfully") #设置开始和结束时间start时间 = int(time.mktime)strptime(“01/04/2019 00:00”、“H % d / Y % m / % %: % m”)))end时间 = int (time.mktime(时间。strptime(“01/06/2019 00:00”、“H % d / Y % m / % %: % m”)))curr时间 =开始时间而curr时间 < = end时间: #设置休息的URL请求URL = ' https://api.darksky.net/forecast/ <关键> / 50.7,4.5,”+ str (curr时间) #发送请求和响应从JSON响应= requests.get翻译(URL) data = response.json()的人力资源数据(“每小时”)(“数据”):时间=人力资源(“时间”)如果“温度”hr.keys (): temp =人力资源(“温度”)如果“cloudCover”hr.keys ():cloud= hr['cloudCover'] c.execute("UPDATE power SET temp=?,cloud=? ")WHERE time >= ?AND time < ?“, (temp,cloud,time,time+60*60)) curr时间 += 24*60*60 conn.commit() print(”记录更新成功")conn.close()

一旦数据进入数据库,我们就可以提取数据并构建我们的图。最后一个程序提示用户输入一个月中的某一天。该程序将从数据库中提取三天的数据,并构建一个图表,显示72小时时间窗口内的发电量、温度和云量。

导入sqlite3导入datetime导入时间导入matplotlibpyplot as plt start = int(input("Enter a start day:")) start_date = datetime.datetime(2019,4,start,0,0,0) start_time = int(time.mktime(start_date.timetuple())) end_time = start_time + 3*24*60*60 #设置数据库连接conn = sqlite3.connect('solar.db') c = conn.cursor() print(" open database successfully") #运行查询sql = "SELECT time, power, temp, cloud FROM power WHERE time>=?AND time <=?" c.execute(sql,(start_time,end_time)) #处理结果t = [] p = [] tp = [] cl = [] for time, power, temp, cloud .fetchall(): t.p append((time-start_time)/(60*60)) p.p append(power/33.7) t.p append(temp) cl.append(cloud*100) plt.plot(t,p,'r-',t,tp,'b-',t,cl,'y-') plt.plot(t,p,'r-',t,tp,'b-',t,cl,'y-')title(‘起始日期’+str(start)) plt.savefig('plot.png')

如果要运行此代码,可以单击这些讲义顶部的按钮下载此项目的项目文件。请注意,我有意从代码中的Dark Sky URL中删除了我的密钥。您需要从Dark Sky获取自己的API密钥,并将其放在该URL中的<key>的位置,以使代码正常工作。

附言

在我上面链接到的项目文件夹中,我还包括了一个Jupyter笔记本。本手册中的代码演示了如何单独使用pandas来收集和组织用于绘图的数据。这里的示例代码展示了pandas支持时间序列数据的一些方式,以及合并两个在不同时间报告值的数据源等操作。