Implement proper timezone handling
This commit is contained in:
parent
408f462a98
commit
bf85f42f94
1 changed files with 49 additions and 4 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
import re
|
||||||
import gzip
|
import gzip
|
||||||
import csv
|
import csv
|
||||||
import datetime
|
import datetime
|
||||||
|
@ -19,16 +20,58 @@ def time_from_str(time: str):
|
||||||
int(time[size-2:]) % 60
|
int(time[size-2:]) % 60
|
||||||
)
|
)
|
||||||
|
|
||||||
def timestamp_from_parts(yearmonth: str, day: str, time: str) -> datetime.datetime:
|
def timestamp_from_parts(tz: datetime.tzinfo, yearmonth: str, day: str, time: str) -> datetime.datetime:
|
||||||
hour, minute = time_from_str(time)
|
hour, minute = time_from_str(time)
|
||||||
|
|
||||||
return datetime.datetime(
|
return datetime.datetime(
|
||||||
|
tzinfo = tz,
|
||||||
year = int(yearmonth[0:4]),
|
year = int(yearmonth[0:4]),
|
||||||
month = int(yearmonth[4:6]),
|
month = int(yearmonth[4:6]),
|
||||||
day = int(day),
|
day = int(day),
|
||||||
hour = hour,
|
hour = hour,
|
||||||
minute = minute
|
minute = minute
|
||||||
)
|
).astimezone(datetime.UTC)
|
||||||
|
|
||||||
|
TIMEZONES = {
|
||||||
|
'-12': datetime.timezone(datetime.timedelta(hours=-12)),
|
||||||
|
'-11': datetime.timezone(datetime.timedelta(hours=-11)),
|
||||||
|
'-10': datetime.timezone(datetime.timedelta(hours=-10)),
|
||||||
|
'-9': datetime.timezone(datetime.timedelta(hours=-9)),
|
||||||
|
'-8': datetime.timezone(datetime.timedelta(hours=-8)),
|
||||||
|
'-7': datetime.timezone(datetime.timedelta(hours=-7)),
|
||||||
|
'-6': datetime.timezone(datetime.timedelta(hours=-6)),
|
||||||
|
'-5': datetime.timezone(datetime.timedelta(hours=-5)),
|
||||||
|
'-4': datetime.timezone(datetime.timedelta(hours=-4)),
|
||||||
|
'-3': datetime.timezone(datetime.timedelta(hours=-3)),
|
||||||
|
'-2': datetime.timezone(datetime.timedelta(hours=-2)),
|
||||||
|
'-1': datetime.timezone(datetime.timedelta(hours=-1)),
|
||||||
|
'-0': datetime.UTC,
|
||||||
|
'+0': datetime.UTC,
|
||||||
|
'+1': datetime.timezone(datetime.timedelta(hours=1)),
|
||||||
|
'+2': datetime.timezone(datetime.timedelta(hours=2)),
|
||||||
|
'+3': datetime.timezone(datetime.timedelta(hours=3)),
|
||||||
|
'+4': datetime.timezone(datetime.timedelta(hours=4)),
|
||||||
|
'+5': datetime.timezone(datetime.timedelta(hours=5)),
|
||||||
|
'+6': datetime.timezone(datetime.timedelta(hours=6)),
|
||||||
|
'+7': datetime.timezone(datetime.timedelta(hours=7)),
|
||||||
|
'+8': datetime.timezone(datetime.timedelta(hours=8)),
|
||||||
|
'+9': datetime.timezone(datetime.timedelta(hours=9)),
|
||||||
|
'+10': datetime.timezone(datetime.timedelta(hours=10)),
|
||||||
|
'+11': datetime.timezone(datetime.timedelta(hours=11)),
|
||||||
|
'+12': datetime.timezone(datetime.timedelta(hours=12)),
|
||||||
|
}
|
||||||
|
|
||||||
|
TIMEZONE_RE = re.compile(r'^(?:[A-Z]+)([+\-]\d)$')
|
||||||
|
|
||||||
|
def timezone_from_str(text: str) -> datetime.timezone:
|
||||||
|
match = TIMEZONE_RE.match(text)
|
||||||
|
|
||||||
|
if match is None:
|
||||||
|
return datetime.UTC
|
||||||
|
|
||||||
|
tz = TIMEZONES.get(match[1])
|
||||||
|
|
||||||
|
return datetime.UTC if tz is None else tz
|
||||||
|
|
||||||
def coord_from_str(text_lat: str, text_lon: str):
|
def coord_from_str(text_lat: str, text_lon: str):
|
||||||
lat = 0.0 if text_lat == '' else float(text_lat)
|
lat = 0.0 if text_lat == '' else float(text_lat)
|
||||||
|
@ -60,8 +103,10 @@ class StormReport():
|
||||||
def from_csv_row(row: dict):
|
def from_csv_row(row: dict):
|
||||||
report = StormReport()
|
report = StormReport()
|
||||||
|
|
||||||
report.timestamp_start = timestamp_from_parts(row['BEGIN_YEARMONTH'], row['BEGIN_DAY'], row['BEGIN_TIME'])
|
tz = timezone_from_str(row['CZ_TIMEZONE'])
|
||||||
report.timestamp_end = timestamp_from_parts(row['END_YEARMONTH'], row['END_DAY'], row['END_TIME'])
|
|
||||||
|
report.timestamp_start = timestamp_from_parts(tz, row['BEGIN_YEARMONTH'], row['BEGIN_DAY'], row['BEGIN_TIME'])
|
||||||
|
report.timestamp_end = timestamp_from_parts(tz, row['END_YEARMONTH'], row['END_DAY'], row['END_TIME'])
|
||||||
report.episode_id = int(row['EPISODE_ID'])
|
report.episode_id = int(row['EPISODE_ID'])
|
||||||
report.event_id = int(row['EVENT_ID'])
|
report.event_id = int(row['EVENT_ID'])
|
||||||
report.state = row['STATE']
|
report.state = row['STATE']
|
||||||
|
|
Loading…
Add table
Reference in a new issue