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))