|
| 1 | +# run this script and pipe to hurricanes.json; upload to CI server and change |
| 2 | +# hash in scripts/datastore.js |
| 3 | + |
| 4 | +import datetime |
| 5 | +import json |
| 6 | +import sys |
| 7 | +import time |
| 8 | + |
| 9 | +import pandas |
| 10 | + |
| 11 | +basins = { |
| 12 | + 'NA': 'North Atlantic', |
| 13 | + 'EP': 'Eastern North Pacific', |
| 14 | + 'WP': 'Western North Pacific', |
| 15 | + 'NI': 'North Indian', |
| 16 | + 'SI': 'South Indian', |
| 17 | + 'SP': 'Southern Pacific', |
| 18 | + 'SA': 'South Atlantic', |
| 19 | +} |
| 20 | + |
| 21 | +url = 'https://www.ncei.noaa.gov/data/international-best-track-archive-for-climate-stewardship-ibtracs/v04r01/access/csv/ibtracs.since1980.list.v04r01.csv' # noqa |
| 22 | + |
| 23 | +lastlog = time.time() |
| 24 | +storms = {} |
| 25 | +df = pandas.read_csv(url, keep_default_na=False) |
| 26 | +for row in df.itertuples(): |
| 27 | + try: |
| 28 | + sid = row.SID |
| 29 | + name = row.NAME.title() |
| 30 | + basin = basins[row.BASIN] |
| 31 | + dist2land = float(row.DIST2LAND) |
| 32 | + lon = float(row.LON) |
| 33 | + lat = float(row.LAT) |
| 34 | + pressure = float(row.WMO_PRES) |
| 35 | + wind = float(row.WMO_WIND) |
| 36 | + when = int(datetime.datetime.strptime( |
| 37 | + row.ISO_TIME, '%Y-%m-%d %H:%M:%S').timestamp() * 1000) |
| 38 | + except Exception: |
| 39 | + continue |
| 40 | + if wind <= 0 or pressure <= 0: |
| 41 | + continue |
| 42 | + if sid not in storms: |
| 43 | + storms[sid] = { |
| 44 | + 'name': name, 'basin': basin, 'land': False, |
| 45 | + 'dist2land': [], |
| 46 | + 'longitude': [], |
| 47 | + 'latitude': [], |
| 48 | + 'pressure': [], |
| 49 | + 'wind': [], |
| 50 | + 'time': [], |
| 51 | + } |
| 52 | + storms[sid]['land'] = storms[sid]['land'] or dist2land <= 0 |
| 53 | + storms[sid]['dist2land'].append(dist2land) |
| 54 | + storms[sid]['longitude'].append(lon) |
| 55 | + storms[sid]['latitude'].append(lat) |
| 56 | + storms[sid]['pressure'].append(pressure) |
| 57 | + storms[sid]['wind'].append(wind) |
| 58 | + storms[sid]['time'].append(when) |
| 59 | + if time.time() - lastlog > 10: |
| 60 | + sys.stderr.write(f'{len(storms)}\n') |
| 61 | + lastlog = time.time() |
| 62 | +sys.stderr.write(f'{len(storms)}\n') |
| 63 | +results = [storm for storm in storms.values() if len(storm['time']) > 1] |
| 64 | +sys.stderr.write(f'{len(results)}\n') |
| 65 | +sys.stderr.write(f'NA {len([r for r in results if r["basin"] == "North Atlantic"])}\n') |
| 66 | +print(json.dumps(results)) |
0 commit comments