def fill_missing_dates(dates, freq=None): """ Finds and fills the missing dates in a :class:`DateArray`. Parameters ---------- dates : {DateArray} Initial array of dates. freq : {freq_spec}, optional Frequency of result. If not specified, the frequency of the input is used. """ # Check the frequency ........ orig_freq = freq freq = check_freq(freq) if (orig_freq is not None) and (freq == _c.FR_UND): freqstr = check_freq_str(freq) errmsg = "Unable to define a proper date resolution (found %s)." raise ValueError(errmsg % freqstr) # Check the dates ............. if not isinstance(dates, DateArray): errmsg = "A DateArray was expected, got %s instead." raise ValueError(errmsg % type(dates)) # Convert the dates to the new frequency (if needed) if freq != dates.freq: dates = dates.asfreq(freq) # Flatten the array if dates.ndim != 1: dates = dates.ravel() # Skip if there's no need to fill if not dates.has_missing_dates(): return dates # ...and now, fill it ! ...... (tstart, tend) = dates[[0, -1]] return date_array(start_date=tstart, end_date=tend)
def freqstr(self): "Returns the frequency string code." return check_freq_str(self.freq)
def convert_to_float(datearray, ofreq): """ Convert a :class:`~scikits.timeseries.DateArray` object from a ndarray of integers to a ndarray of float at a lower frequency. Parameters ---------- datearray : DateArray Input :class:`~scikits.timeseries.DateArray` to convert. ofreq : var Valid frequency specifier. Notes ----- This function is currently restricted to conversion between annual (``'A'``), quarterly (``'Q'``), monthly (``'M'``) and daily (``'D'``) frequencies only. """ if not isinstance(datearray, DateArray): raise TypeError("The input should be a valid DateArray instance !"\ " (got '%s' instead)" % type(datearray)) errmsg = "Not implemented for the frequencies ('%s', '%s')" # freqdict = dict([(f, check_freq(f)) for f in ('A', 'Q', 'M', 'D')]) ifreq = datearray.freq ofreq = check_freq(ofreq) errmsg = "Not implemented for the frequencies ('%s', '%s')" % \ (check_freq_str(ifreq), check_freq_str(ofreq)) if ifreq < ofreq: output = datearray.asfreq(ofreq).tovalue().astype(float) elif ifreq == ofreq: output = datearray.tovalue().astype(float) # Quarterly......... elif (ifreq >= freqdict['Q']) and (ifreq < freqdict['M']): if (ofreq >= freqdict['A']) and (ofreq < freqdict['Q']): output = datearray.years.astype(float) + (datearray.quarters - 1.) / 4. # Monthly........... elif ifreq == freqdict['M']: #... to annual if (ofreq >= freqdict['A']) and (ofreq < freqdict['Q']): output = datearray.years.astype(float) + (datearray.months - 1) / 12. else: raise NotImplementedError(errmsg) # Daily ............ elif ifreq == freqdict['D']: # ... to annual if (ofreq >= freqdict['A']) and (ofreq < freqdict['Q']): output = datearray.asfreq('A') output = output.tovalue().astype(float) + \ (datearray.yeardays - 1.) / output.yeardays.astype(float) # ... to quarterly elif (ofreq >= freqdict['Q']) and (ofreq < freqdict['M']): raise NotImplementedError # ... to monthly elif ofreq == freqdict['M']: output = datearray.asfreq('M') output = output.tovalue().astype(float) + \ (datearray.days - 1.) / output.days.astype(float) # ... to other else: raise NotImplementedError(errmsg) # Less than daily elif ifreq > freqdict['D']: raise NotImplementedError(errmsg) else: raise NotImplementedError(errmsg) return output