Daylight savings on reports

On Nov 1st our reporting had a snag for our monthly reports that we send to the State. The program just stopped running and we are not that familiar with our new system to ascertain whats going on. We are pretty sure it has something to do with Day light Savings. It reads
"Data Collection Errors
Warn: Error invoking script.Traceback (most recent call last): File " function:updateData", line 4, in updateData File "< File "module:project.report.lakeFortSmith.monthlyOperaions", line 237, in generateReportindexError: Number of Values(30) doesn't match I hope this makes sense to your guys. Thanks for the help

indexError: Number of Values(30)

Sounds like it was looking for the day 30 inside something but it was (no longer?) there.

maybe skipped an entry on the hour shift?

You'll have to show your code or contact support for more help

year = system.date.getYear(StartDate)
	month = system.date.getMonth(StartDate)
	startOfMonth = system.date.getDate(year, month, 1)
	endOfMonth = system.date.addSeconds(system.date.addMonths(startOfMonth, 1), -1)

	daylight_savings = False

	# Check for Daylight Savings time change
	if system.date.isDaylightTime(startOfMonth) and not system.date.isDaylightTime(endOfMonth):
		daylight_savings = True
		day_of_time_change = 7  # integer, day of the month when the time change occurs
	
	if daylight_savings:
		# Start of month up to day of time change
		dst_start = startOfMonth
		dst_end = system.date.addSeconds(system.date.getDate(year, month, day_of_time_change), -1)
		totalsDataset1 = system.tag.queryTagHistory(
													paths=tagPaths,
													startDate=dst_start,
													endDate=dst_end,
													columnNames=colNames,
													intervalHours=24,
													aggregationModes=aggregationModes,
													ignoreBadQuality=1,
													noInterpolation=0
													)
		
		# Day of the time change has 25 hours
		dst_day_start = system.date.getDate(year, month, day_of_time_change)
		dst_day_end = system.date.addSeconds(system.date.addDays(dst_day_start, 1), -1)
		totalsDataset2 = system.tag.queryTagHistory(
													paths=tagPaths,
													startDate=dst_day_start,
													endDate=dst_day_end,
													columnNames=colNames,
													intervalHours=25,
													aggregationModes=aggregationModes,
													ignoreBadQuality=1,
													noInterpolation=0
													)
		
		# Remainder of the month
		st_start = system.date.getDate(year, month, day_of_time_change+1)
		st_end = endOfMonth
		totalsDataset3 = system.tag.queryTagHistory(
													paths=tagPaths,
													startDate=st_start,
													endDate=st_end,
													columnNames=colNames,
													intervalHours=24,
													aggregationModes=aggregationModes,
													ignoreBadQuality=1,
													noInterpolation=0
													)
		totalsDataset = system.dataset.appendDataset(totalsDataset1, totalsDataset2)
		totalsDataset = system.dataset.appendDataset(totalsDataset, totalsDataset3)
	
	# If not Daylight Savings time
	else:
		totalsDataset = system.tag.queryTagHistory(	paths = tagPaths,
															startDate = startOfMonth,
															endDate = endOfMonth,
															columnNames = colNames,
															intervalHours = 24,
															aggregationModes = aggregationModes,#project.tag.history.aggregate.firstValue(),
															ignoreBadQuality = 1,
															avoidInterpolation = 1)
														
#	data['average'] = system.tag.queryTagHistory(		paths=tagPaths,
#														startDate = startOfMonth,
#														endDate = endOfMonth,
#														aggregationMode = "Average",
#														columnNames = colNames,
#														ignoreBadQuality = 1,
#														avoidInterpolation = 1,
#														returnSize = 1)
#													
#	data['maximum']	=	system.tag.queryTagHistory(		paths = tagPaths,
#														startDate =	startOfMonth,
#														endDate = endOfMonth,
#														aggregationMode = "Maximum",
#														columnNames = colNames,
#														ignoreBadQuality = 1,
#														avoidInterpolation = 1,
#														returnSize = 1)		
#																								
#	data['minimum']	=	system.tag.queryTagHistory(		paths = tagPaths,
#														startDate =	startOfMonth,
#														endDate = endOfMonth,
#														aggregationMode = "Minimum",
#														columnNames = colNames,
#														ignoreBadQuality = 1,
#														avoidInterpolation = 1,
#														returnSize = 1)

	datasetHeaders		=	['t_stamp','turb1','turb2','turb3','turb4','turb5','turb6']

	colName = 'Finished Turbidity'
	tagPath = '[Lake_Fort_Smith]Readings/Post 4MG/Turbidity/value'

	tagHistory			=	system.tag.queryTagHistory(		paths = [tagPath],
															startDate = startOfMonth,
															endDate = endOfMonth,
															intervalHours = 4,
															aggregationMode = "Average",#project.tag.history.aggregate.firstValue(),
															ignoreBadQuality = 1,
															avoidInterpolation = 1)

	tagHistoryPDS = system.dataset.toPyDataSet(tagHistory)
	
	datasetRows = []
	newRow		= []

	for idx,row in enumerate(tagHistoryPDS):
		time = row[0]
		turb = row[1]
		
		if idx%6 in [0]:
			newRow = [time,turb]
		if idx%6 in [1,2,3,4]:
			newRow += [turb]
		if idx%6 in [5]:
			newRow += [turb]
			datasetRows.append(newRow)
			
		turbDataset = system.dataset.toDataSet(datasetHeaders, datasetRows)

	#Add Columns to combine datasets for Totals and Finished Turbidity
	for col in range(turbDataset.getColumnCount()):	
		if col == 0: continue
		
		colData = []
		colName = "turb%s" % (col)
		for row in range(turbDataset.getRowCount()):
			colData.append(turbDataset.getValueAt(row,col))
		
		totalsDataset = system.dataset.addColumn(	totalsDataset,
													colData,
													colName,
													float)
	
	#MM - 2021-02-11 - Query East Filter seperately and move forward a day
	if daylight_savings:
		# Start of month up to day of time change
			dst_start = startOfMonth
			dst_end = system.date.addSeconds(system.date.getDate(year, month, day_of_time_change), -1)
			eastFilterDataset1 = system.tag.queryTagHistory(paths = ['[Lake_Fort_Smith]Filter/East/Backwash/Flow Total/value'],
																startDate = dst_start,
																endDate = dst_end,
																columnNames = ['t_stamp','eastBackwashFlow'],
																intervalHours = 24,
																aggregationModes = ['Range'],
																ignoreBadQuality = 1,
																avoidInterpolation = 1)
			
			# Day of the time change has 25 hours
			dst_day_start = system.date.getDate(year, month, day_of_time_change)
			dst_day_end = system.date.addSeconds(system.date.addDays(dst_day_start, 1), -1)
			eastFilterDataset2 = system.tag.queryTagHistory(paths = ['[Lake_Fort_Smith]Filter/East/Backwash/Flow Total/value'],
																startDate = dst_day_start,
																endDate = dst_day_end,
																columnNames = ['t_stamp','eastBackwashFlow'],
																intervalHours = 25,
																aggregationModes = ['Range'],
																ignoreBadQuality = 1,
																avoidInterpolation = 1)
			
			# Remainder of the month
			st_start = system.date.getDate(year, month, day_of_time_change+1)
			st_end = endOfMonth
			eastFilterDataset3 = system.tag.queryTagHistory(paths = ['[Lake_Fort_Smith]Filter/East/Backwash/Flow Total/value'],
																startDate = st_start,
																endDate = st_end,
																columnNames = ['t_stamp','eastBackwashFlow'],
																intervalHours = 24,
																aggregationModes = ['Range'],
																ignoreBadQuality = 1,
																avoidInterpolation = 1)
																
			eastFilterDataset = system.dataset.appendDataset(eastFilterDataset1, eastFilterDataset2)
			eastFilterDataset = system.dataset.appendDataset(eastFilterDataset, eastFilterDataset3)
	
	else:
		eastFilterDataset = system.tag.queryTagHistory(	paths = ['[Lake_Fort_Smith]Filter/East/Backwash/Flow Total/value'],
														startDate = system.date.addDays(startOfMonth, -1),
														endDate = system.date.addDays(endOfMonth, -1),
														columnNames = ['t_stamp','eastBackwashFlow'],
														intervalHours = 24,
														aggregationModes = ['Range'],
														ignoreBadQuality = 1,
														avoidInterpolation = 1)							
													
	colData = []
	for row in range(eastFilterDataset.rowCount):
		colData.append(eastFilterDataset.getValueAt(row,1)) #column 0 is t_stamp, get column 1
	totalsDataset = system.dataset.addColumn(	totalsDataset,
												colData,
												'eastBackwashFlow',
												float)
	
	#MM - 2021-02-11 - Add CL2 Residual (Post 4MG) AM (0-12) & PM (12-24) Minimum
	if daylight_savings:
		# Start of month up to day of time change
		dst_start = startOfMonth
		dst_end = system.date.addSeconds(system.date.getDate(year, month, day_of_time_change), -1)
		cl2Min1 = system.tag.queryTagHistory(paths = ['[Lake_Fort_Smith]Readings/Post 4MG/CL2 Residual/value'],
												startDate = dst_start,
												endDate = dst_end,
												columnNames = ['t_stamp','cl2Min'],
												intervalHours = 12,
												aggregationModes = ['Minimum'],
												ignoreBadQuality = 1,
												avoidInterpolation = 1)
		# Day of the time change has 13 hours
		dst_day_start = system.date.getDate(year, month, day_of_time_change)
		dst_day_end = system.date.addSeconds(system.date.addHours(dst_day_start, 12), -1)
		cl2Min2 = system.tag.queryTagHistory(paths = ['[Lake_Fort_Smith]Readings/Post 4MG/CL2 Residual/value'],
														startDate = dst_day_start,
														endDate = dst_day_end,
														columnNames = ['t_stamp','cl2Min'],
														intervalHours = 13,
														aggregationModes = ['Minimum'],
														ignoreBadQuality = 1,
														avoidInterpolation = 1)
		# Remainder of the month
		st_start = system.date.addHours(dst_day_start, 12)
		st_end = endOfMonth
		cl2Min3 = system.tag.queryTagHistory(paths = ['[Lake_Fort_Smith]Readings/Post 4MG/CL2 Residual/value'],
																startDate = st_start,
																endDate = st_end,
																columnNames = ['t_stamp','cl2Min'],
																intervalHours = 12,
																aggregationModes = ['Minimum'],
																ignoreBadQuality = 1,
																avoidInterpolation = 1)
		
		cl2Min = system.dataset.appendDataset(cl2Min1, cl2Min2)
		cl2Min = system.dataset.appendDataset(cl2Min, cl2Min3)
		
	else:
		cl2Min = system.tag.queryTagHistory(paths = ['[Lake_Fort_Smith]Readings/Post 4MG/CL2 Residual/value'],
											startDate = startOfMonth,
											endDate = endOfMonth,
											columnNames = ['t_stamp','cl2Min'],
											intervalHours = 12,
											aggregationModes = ['Minimum'],
											ignoreBadQuality = 1,
											avoidInterpolation = 1)
	colDataAM = []
	colDataPM = []
	
	for am,pm in zip(*[iter(range(cl2Min.rowCount))]*2):
		cl2MinAM = cl2Min.getValueAt(am,1)
		colDataAM.append(cl2MinAM)
		cl2MinPM = cl2Min.getValueAt(pm,1)
		colDataPM.append(cl2MinPM)
	totalsDataset = system.dataset.addColumn(	totalsDataset,
												colDataAM,
												'cl2MinAM',
												float)
	totalsDataset = system.dataset.addColumn(	totalsDataset,
												colDataPM,
												'cl2MinPM',
												float)
	
	#MM - 2021-02-09 - Set values for current day and following day to 0
	now = system.date.now()
	todayStart = system.date.setTime(now, 0, 0, 0)
	for row in range(totalsDataset.rowCount):
		t_stamp = totalsDataset.getValueAt(row, 't_stamp')
		#if t_stamp == todayStart: #if row is today
		if system.date.getDayOfMonth(t_stamp) in [system.date.getDayOfMonth(todayStart),system.date.getDayOfMonth(todayStart)+1]:
			for col in range(totalsDataset.columnCount - 1): #for all columns minus the first column (t_stamp)
				totalsDataset = system.dataset.setValue(totalsDataset, row, col+1, 0) #set value to 0
	data["Totals"] = totalsDataset

	return data

I just sent the code

PHEW thats a lot of code xD
which is line 237?

According to that snippet, line 237 is this:
cl2Min = system.dataset.appendDataset(cl2Min1, cl2Min2)

That function would fail if you have a different number of columns in the two datasets you're trying to append together.

this is line 237 sorry i didnt include the line markers

1 Like