Code source de EWtoPy
#!/usr/bin/env python
"""Convert EasyWeather.dat data to pywws format
::
%s
This program assumes that EasyWeather used your local time, and
converts time stamps to UTC. This can create ambiguities when the
clocks go back in October, which the program attempts to detect and
correct.
"""
__docformat__ = "restructuredtext en"
__usage__ = """
usage: python EWtoPy.py [options] EasyWeather_file data_dir
options are:
-h or --help display this help
EasyWeather_file is the input data file, e.g. EasyWeather.dat
data_dir is the root directory of the weather data
"""
__doc__ %= __usage__
__usage__ = __doc__.split('\n')[0] + __usage__
from datetime import datetime, timedelta
import getopt
import os
import sys
from pywws import DataStore
from pywws import TimeZone
[docs]def main(argv=None):
if argv is None:
argv = sys.argv
try:
opts, args = getopt.getopt(argv[1:], "", ['help'])
except getopt.error, msg:
print >>sys.stderr, 'Error: %s\n' % msg
print >>sys.stderr, __usage__.strip()
return 1
# process options
for o, a in opts:
if o == '--help':
usage()
return 0
# check arguments
if len(args) != 2:
print >>sys.stderr, 'Error: 2 arguments required\n'
print >>sys.stderr, __usage__.strip()
return 2
# process arguments
in_name = args[0]
out_name = args[1]
# open input
in_file = open(in_name, 'r')
# open data file store
ds = DataStore.data_store(out_name)
# get time to go forward to
first_stored = ds.after(datetime.min)
if first_stored == None:
first_stored = datetime.max
# copy any missing data
last_date = None
count = 0
for line in in_file:
items = line.split(',')
local_date = DataStore.safestrptime(items[2].strip(), '%Y-%m-%d %H:%M:%S')
local_date = local_date.replace(tzinfo=TimeZone.Local)
date = local_date.astimezone(TimeZone.utc)
if last_date and date < last_date:
date = date + timedelta(hours=1)
print "Corrected DST ambiguity %s %s -> %s" % (
local_date, local_date.tzname(), date)
last_date = date
date = date.replace(tzinfo=None)
# get data
data = {}
data['delay'] = int(items[3])
data['hum_in'] = int(items[4])
data['temp_in'] = float(items[5])
try:
data['hum_out'] = int(items[6])
except:
data['hum_out'] = None
try:
data['temp_out'] = float(items[7])
except:
data['temp_out'] = None
data['abs_pressure'] = float(items[10])
try:
data['wind_ave'] = float(items[12])
except:
data['wind_ave'] = None
try:
data['wind_gust'] = float(items[14])
except:
data['wind_gust'] = None
try:
data['wind_dir'] = int(items[16])
except:
data['wind_dir'] = None
data['rain'] = int(items[18]) * 0.3
data['status'] = int(items[35].split()[15], 16)
# check against first_stored
if first_stored - date < timedelta(minutes=data['delay'] // 2):
break
ds[date] = data
count += 1
print "%d records written" % count
in_file.close()
del ds
return 0
if __name__ == "__main__":
sys.exit(main())