public String toString() {
		final DecimalFormat df = new DecimalFormat("+0.0000000000E00");
		// print header row
		StringBuffer buff = new StringBuffer();
		buff.append(padWithBlanks("", 10));
		buff.append(" ");
		for(int i = 0; i < dsNames.length; i++) {
			buff.append(padWithBlanks(dsNames[i], 18));
		}
		buff.append("\n \n");
		for(int i = 0; i < timestamps.length; i++) {
			buff.append(padWithBlanks("" + timestamps[i], 10));
			buff.append(":");
			for(int j = 0; j < dsNames.length; j++) {
				double value = values[j][i];
				String valueStr = Double.isNaN(value)? "nan": df.format(value);
				buff.append(padWithBlanks(valueStr, 18));
			}
			buff.append("\n");
		}
		return buff.toString();
	}