87 lines
3.1 KiB
Plaintext
87 lines
3.1 KiB
Plaintext
from datetime import datetime
|
|
def getBaseTagPaths(collection, location=None):
|
|
if location is not None:
|
|
return collection[location]
|
|
else:
|
|
# return [x for v in collection.values() for x in v]
|
|
return [value for key, values in collection.items() if key in ["Common","DH1","DH2","DH3","DH4","DH5"] for value in values]
|
|
|
|
|
|
def getHistory(paths, startDate, endDate, customArgs={}):
|
|
"""
|
|
Generic get history
|
|
Args:
|
|
paths: [] of strings/tagpaths
|
|
startDate: date start of range
|
|
endDate: date end of range
|
|
customArgs: dictionary of custom values if needed
|
|
returns:
|
|
PyDataSet
|
|
"""
|
|
intervalMin = customArgs.get("intervalMinutes",1)
|
|
noInterpol = customArgs.get("noInterpolation",True)
|
|
ignoreBad = customArgs.get("ignoreBadQuality",True)
|
|
aggMode = customArgs.get("aggregationMode","LastValue")
|
|
|
|
histDS = system.tag.queryTagHistory(paths, startDate, endDate, aggregationMode = aggMode, intervalMinutes= intervalMin,noInterpolation= noInterpol, ignoreBadQuality= ignoreBad )
|
|
# print "common.util.getHist", histDS.getRowCount(), paths
|
|
return system.dataset.toPyDataSet(histDS)
|
|
|
|
|
|
def generateSumCol(hist, sumColName="SumRealPwr"):
|
|
allHeaders = system.dataset.getColumnHeaders(hist)
|
|
|
|
sumCol = []
|
|
for row in hist:
|
|
try:
|
|
sumCol.append(sum([row[h] for h in allHeaders[1:] if row[h] is not None]) if len(allHeaders)>1 else 0)
|
|
except:
|
|
sumCol.append(0)
|
|
|
|
return system.dataset.toPyDataSet(system.dataset.addColumn(hist, sumCol, sumColName, float))
|
|
|
|
def averageIntervalData(histDS, interval=15):
|
|
"""
|
|
Average values over time based on minute per minute data.
|
|
First column should be t_stamp
|
|
"""
|
|
timeUnitStr = ""
|
|
GroupDict= {} # represents {"datetime":{"col1":[], "col2":[]...}}
|
|
histDsCols = system.dataset.getColumnHeaders(histDS)[1:]
|
|
resultData = []
|
|
for i,row in enumerate(histDS):
|
|
if i%interval == 0:
|
|
timeUnitStr = system.date.format(row["t_stamp"],"yyyy-MM-dd HH:mm")
|
|
GroupDict.setdefault(timeUnitStr, {})
|
|
GroupDict[timeUnitStr]={col:[] for col in histDsCols}
|
|
# GroupDict[quarterHrStr].append(row["SumRealPwr"])
|
|
for col in histDsCols:
|
|
GroupDict[timeUnitStr][col].append(row[col] if row[col] is not None else 0)
|
|
sortedDateKeys = sorted(GroupDict.keys(), key=lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M'))
|
|
for dt_str in sortedDateKeys:
|
|
oneRow = [system.date.parse(dt_str, "yyyy-MM-dd HH:mm")]+ [sum(GroupDict[dt_str][col])/len(GroupDict[dt_str][col]) for col in histDsCols]
|
|
resultData.append(oneRow)
|
|
|
|
return system.dataset.toPyDataSet(system.dataset.toDataSet(["t_stamp"]+histDsCols, resultData))
|
|
|
|
|
|
def mergeHistorianData(ds1, ds2):
|
|
"""
|
|
Expects 2 sets of historian data, sanity check . t_stamp should be column index 0, so we only need one
|
|
"""
|
|
if len(ds1) != len(ds2):
|
|
raise Exception("Mismatch on both datasets")
|
|
else:
|
|
ds1Header = system.dataset.getColumnHeaders(ds1)
|
|
ds2Header = system.dataset.getColumnHeaders(ds2)[1:]
|
|
|
|
newHeader = ds1Header+ds2Header
|
|
|
|
allRows = []
|
|
for i,row in enumerate(ds1):
|
|
newRow = [c for c in row] + ([c for c in ds2[i]][1:])
|
|
allRows.append(newRow)
|
|
# print len(newHeader), len(allRows[0])
|
|
return system.dataset.toPyDataSet(system.dataset.toDataSet(newHeader, allRows))
|
|
|
|
|