Beispiel #1
0
    def test_dtrange_stop_n(self):
        start = datetime(2000, 1, 1)
        stop = datetime(2001, 1, 1)
        n = 10

        for ctr, it in enumerate(dtrange(start, stop, n=n, endpoint=False)):
            pass

        self.assertEqual(n, ctr+1)
        self.assertTrue(it < stop)

        for ctr, it in enumerate(dtrange(start, stop, n=n, endpoint=True)):
            pass

        self.assertEqual(n, ctr+1)
        self.assertEqual(stop, it)
Beispiel #2
0
    def __init__(self, start, stop=None, step=None, n=None, units='s',
                 endpoint=False):
        '''
        Parameters
        ----------
        start : time
            First inclusive time.
        stop : time, optional
            Optional. Inclusive if closed=True.
        step : timedelta or number, optional
            Requires units if is a number.
        n : number, optional
            Number of divisions between start and stop.
        units : str, optional
            h=hour, m=minute, s=second, ms=millisec, us=microsec
            Default is 's'.
        endpoint : bool, optional
            If true, then stop is included, otherwise use half-open bounds.
            Default is False.
        '''
        start = datetime_from_time(start)

        if stop:
            stop = datetime_from_time(stop)

        self.dtrange = dtrange(start, stop=stop, step=step, n=n, units=units,
                               endpoint=endpoint)
Beispiel #3
0
    def test_dtrange_stop_step_units_month(self):
        start = datetime(2000, 1, 1)
        stop = datetime(2002, 1, 1)

        for it in dtrange(start, stop, step=1, units='m', endpoint=1):
            pass

        self.assertEqual(stop, it)
Beispiel #4
0
    def test_dtrange_stop_step_units_year(self):
        start = datetime(2000, 1, 1)
        stop = datetime(2020, 1, 1)

        for it in dtrange(start, stop, step=1, units='y'):
            pass

        expect = datetime(2019, 1, 1)
        self.assertEqual(expect, it)
Beispiel #5
0
    def test_dtrange_step_n(self):
        start = datetime(2000, 1, 1)
        step = timedelta(1)

        for it in dtrange(start, step=step, n=31):
            pass

        expect = datetime(2000, 1, 31)
        self.assertEqual(expect, it)
Beispiel #6
0
    def test_dtrange_stop_step_endpoint(self):
        start = datetime(2000, 1, 1)
        stop = datetime(2000, 2, 1)
        step = timedelta(1)

        for it in dtrange(start, stop, step, endpoint=True):
            pass

        expect = datetime(2000, 2, 1)
        self.assertEqual(expect, it)
Beispiel #7
0
    def test_dtrange_step_n_units(self):
        start = datetime(2000, 1, 1)
        n = 10

        for units in ['y', 'm', 'w', 'd', 'h', 'min', 's', 'ms', 'us']:
            for ctr, it in enumerate(dtrange(start, step=1, n=n, units=units)):
                pass

            self.assertTrue(it > start)
            self.assertEqual(n, ctr + 1)
Beispiel #8
0
    def test_dtrange_stop_step_units(self):
        start = datetime(2000, 1, 1)
        stop = datetime(2000, 2, 1)

        for units in ['w', 'd']:
            for it in dtrange(start, stop, step=1, units=units, endpoint=True):
                pass

        self.assertEqual(stop, it)

        stop = datetime(2000, 1, 2)
        for units in ['h', 'min', 's']:
            for it in dtrange(start, stop, step=1, units=units, endpoint=True):
                pass

        self.assertEqual(stop, it)

        stop = datetime(2000, 1, 1, 0, 0, 0, 10)
        for units in ['ms', 'us']:
            for it in dtrange(start, stop, step=1, units=units, endpoint=True):
                pass

        self.assertEqual(stop, it)
Beispiel #9
0
def _chop_date_range_into_days(datetime_begin, datetime_end):
    """
    Returns a range of days (datetimes) that are fully within the given date range.
    :param datetime_begin: a datetime object that indicates the inclusive lower bound of the desired date-range
    :param datetime_end: a datetime object that indicates the exclusive upper bound of the desired date-range
    :return: An ordered list of datetime objects containing the days that are fully within the given range,
        as well as a tuple containing whether the left part and the right part of the date range have been consumed completely.
    """
    if datetime_begin > datetime_end:
        raise ValueError("date_begin cannot be larger than date_end")
    range_begin = datetime(datetime_begin.year, datetime_begin.month, datetime_begin.day)
    range_end = datetime(datetime_end.year, datetime_end.month, datetime_end.day)
    complete_l = True
    complete_r = True
    if datetime_begin.hour != 0 or datetime_begin.minute != 0:
        range_begin += timedelta(1)
        complete_l = False
    if datetime_end.hour != 0 or datetime_end.minute != 0:
        complete_r = False
    return [day for day in dtrange(range_begin, range_end, step=1, units='d')], (complete_l, complete_r)
Beispiel #10
0
 def test_dtrange_bad_args(self):
     raised = False
     try: dtrange(datetime(1,1,1))
     except: raised = True
     
     self.assertTrue(raised)
     
     raised = False
     try: dtrange(datetime(1,1,1), stop=datetime(2,2,2))
     except: raised = True
     
     self.assertTrue(raised)
     
     raised = False
     try: dtrange(datetime(1,1,1), units='y', n=10)
     except: raised = True
     
     self.assertTrue(raised)
Beispiel #11
0
    def __call__(self,
                 varName,
                 sDTime,
                 eDTime,
                 BBox=None,
                 res=None,
                 delT=None):
        '''
        res     : spa. res. of 2d-array
        sDTime  : DTime bound left
        eDTime  : DTime bound right
        '''

        mapCode = '^' + ''.join(str(res).split('.'))

        gpmData = GPM_data()

        srcDir = os.path.join(self.dataDir, self.prdDir)

        assert os.path.exists(srcDir), '{} is not exists.'.format(srcDir)
        Granule = self.search_granules(srcDir, sDTime, eDTime, BBox)

        if len(Granule) == 0:
            print('! Warning ! no data extracted')
            return None

        outSize = sum([len(gra[2]) for gra in Granule]), Granule[0][2].shape[1]
        Lat = empty(outSize, 'float32')
        Lon = empty(outSize, 'float32')
        aOut = empty(outSize, 'float32')
        DTime = []

        prvI = 0
        for granule in Granule:

            srcPath, dtime, lat, lon, idx = granule

            gpmData.srcPath.append(srcPath)
            gpmData.recLen.append(
                len(dtime))  # number of data record for each file

            nxtI = prvI + len(dtime)

            aOut[prvI:nxtI] = self.func_read(srcPath, varName, idx.tolist())
            Lat[prvI:nxtI] = lat
            Lon[prvI:nxtI] = lon
            DTime.extend(dtime)

            if res != None and delT == None:
                gpmData.griddata.append(
                    granule2map(lat, lon, aOut[prvI:nxtI], BBox, res))
                gpmData.grid = GridCoordinates(mapCode, BBox=BBox)

            prvI = nxtI

        if delT != None:
            dtBnd = dtrange(sDTime, eDTime, delT)

            gpmData.tbound = map(None, dtBnd[:-1], dtBnd[1:])
            gpmData.dtime = bin_bytbound(DTime, dtBnd, DTime)
            gpmData.lat = bin_bytbound(DTime, dtBnd, Lat)
            gpmData.lon = bin_bytbound(DTime, dtBnd, Lon)
            gpmData.data = bin_bytbound(DTime, dtBnd, aOut)

            if res != None:
                gpmData.griddata = [
                    granule2map(lat, lon, a, BBox, res) for lat, lon, a in map(
                        None, gpmData.lat, gpmData.lon, gpmData.data)
                ]
                gpmData.grid = GridCoordinates(mapCode, BBox=BBox)

        else:
            gpmData.dtime = DTime
            gpmData.lat = Lat
            gpmData.lon = Lon
            gpmData.data = aOut

        return gpmData