code: function(json, options) {
  	var series_list = _.plain(json).pselect('*').sortPlain().keys().value()
  	, years = new Year();
  	
  	options = _.defaults(options || {}, {
  		interval: 'month',
  		date_key: 'date',
  		timeSeries: true,
  		series_list: series_list		
  	});
  	
  	// build the timeSeries from an object grouped by date;
  	// toJSON() applies the "select *, pivot" criteria to the PlainObject;
  	_.plain(json).query('select *, pivot').each(function(row, date) {
  		if (date) {
  			years.add(_.date({'dateIn': date}).key(), row );
  		}
  	}, this);
  	
  	// now bucket series counts in year or year/month buckets; pivot back to the original form
  	json = _.object( [options.date_key], [pivot( _.reduce(years.getRange(), function(result, year) {
  		return _.extend(result, years.get(year).get(options.interval, _.reduce(series_list, function(res, c) { 
  			res[c] = 0; 
  			return res; 
  		}, {}), options.date_key) || {});
  	}, {}, this) )] );
  	
  	// add interval and date_key to the object;
  	return _.extend(json, options);
  }
docs: operates on a set of rows grouped by date 'yyyy/mm/dd'. Buckets values by year and month, to produce a plain object analyzes all series and builds a range based on the intersection of the widest extent of all series