def test_parse_date(): assert parse_date("1851-06-25T00:00") == datetime.datetime(1851, 6, 25) assert parse_date("1851-06-25T06:00") == datetime.datetime(1851, 6, 25, 6) assert parse_date("1851-06-25") == datetime.datetime(1851, 6, 25) assert parse_date("18510625") == datetime.datetime(1851, 6, 25) assert parse_date(18510625) == datetime.datetime(1851, 6, 25) assert parse_date("1851-06-25 06:00:00") == datetime.datetime( 1851, 6, 25, 6) assert parse_date("1851-06-25T06:00:00") == datetime.datetime( 1851, 6, 25, 6) assert parse_date("1851-06-25T06:00:00Z") == datetime.datetime( 1851, 6, 25, 6, tzinfo=datetime.timezone.utc) assert parse_date(-2) == parse_date(0) - datetime.timedelta(days=2)
def _load(self, bassin="atlantic", url=None): if url is None: url = URLS[bassin.lower()] path = download_and_cache(url) p = [] with open(path) as f: lines = f for line in lines: if line[0] in (" ", "<", "\n"): continue bassin = line[0:2] number = int(line[2:4]) year = int(line[4:8]) name = line[18:28].strip().lower() # id = line[0:8] # http://www.aoml.noaa.gov/hrd/hurdat/hurdat2-format-may2015.pdf for _ in range(0, int(line[33:36])): line = next(lines) knots = float(line[38:41]) pressure = np.NaN if line[43] == "-" else float(line[43:47]) time = "%s-%s-%sZ%s:%s" % ( line[0:4], line[4:6], line[6:8], line[10:12], line[12:14], ) p.append( dict( # id=id, bassin=bassin, number=number, year=year, name=name, time=parse_date(time), type=line[16], status=line[19:21], lat=float(line[23:27]) * SIGN[line[27]], lon=float(line[30:35]) * SIGN[line[35]], knots=knots, category=category(knots), pressure=pressure, ) ) self.cyclones = self.annotate(pd.DataFrame(p), style="cyclone-track")