Browse Source

Use pip version of datetime_tz; fix timestamper test

Jim Paris 4 years ago
7 changed files with 5 additions and 946 deletions
  1. +1
  2. +0
  3. +0
  4. +1
  5. +1
  6. +1
  7. +1

+ 1
- 0
README.txt View File

@@ -9,6 +9,7 @@ Prerequisites:
# Base NilmDB dependencies
sudo pip3 install cherrypy decorator simplejson requests
sudo pip3 install python-dateutil tz progressbar psutil
sudo pip3 install python-datetime-tz

# Other dependencies (required by some modules)
sudo pip3 install numpy

+ 0
- 710
nilmdb/utils/datetime_tz/ View File

@@ -1,710 +0,0 @@
# Copyright 2009 Google Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# See the License for the specific language governing permissions and
# limitations under the License.
# Disable the invalid name warning as we are inheriting from a standard library
# object.
# pylint: disable-msg=C6409,W0212

"""A version of the datetime module which *cares* about timezones.

This module will never return a naive datetime object. This requires the module
know your local timezone, which it tries really hard to figure out.

You can override the detection by using the datetime.tzaware.defaulttz_set
method. It the module is unable to figure out the timezone itself this method
*must* be called before the normal module is imported. If done before importing
it can also speed up the time taken to import as the defaulttz will no longer
try and do the detection.

__author__ = " (Tim Ansell)"

import calendar
import datetime
import os
import os.path
import re
import time
import warnings
import dateutil.parser
import dateutil.relativedelta
import pytz
from . import pytz_abbr

# pylint: disable-msg=C6204
import functools
except ImportError as e:

class functools(object):
"""Fake replacement for a full functools."""

# pylint: disable-msg=W0613
def wraps(f, *args, **kw):
return f

# Need to patch pytz.utc to have a _utcoffset so you can normalize/localize
# using it.
pytz.utc._utcoffset = datetime.timedelta()

timedelta = datetime.timedelta

def _tzinfome(tzinfo):
"""Gets a tzinfo object from a string.

tzinfo: A string (or string like) object, or a datetime.tzinfo object.

An datetime.tzinfo object.

UnknownTimeZoneError: If the timezone given can't be decoded.
if not isinstance(tzinfo, datetime.tzinfo):
tzinfo = pytz.timezone(tzinfo)
except AttributeError:
raise pytz.UnknownTimeZoneError("Unknown timezone! %s" % tzinfo)
return tzinfo

# Our "local" timezone
_localtz = None

def localtz():
"""Get the local timezone.

The localtime timezone as a tzinfo object.
# pylint: disable-msg=W0603
global _localtz
if _localtz is None:
_localtz = detect_timezone()
return _localtz

def localtz_set(timezone):
"""Set the local timezone."""
# pylint: disable-msg=W0603
global _localtz
_localtz = _tzinfome(timezone)

def detect_timezone():
"""Try and detect the timezone that Python is currently running in.

We have a bunch of different methods for trying to figure this out (listed in
order they are attempted).
* Try TZ environment variable.
* Try and find /etc/timezone file (with timezone name).
* Try and find /etc/localtime file (with timezone data).
* Try and match a TZ to the current dst/offset/shortname.

The detected local timezone as a tzinfo object

pytz.UnknownTimeZoneError: If it was unable to detect a timezone.
# First we try the TZ variable
tz = _detect_timezone_environ()
if tz is not None:
return tz

# Second we try /etc/timezone and use the value in that
tz = _detect_timezone_etc_timezone()
if tz is not None:
return tz

# Next we try and see if something matches the tzinfo in /etc/localtime
tz = _detect_timezone_etc_localtime()
if tz is not None:
return tz

# Next we try and use a similiar method to what PHP does.
# We first try to search on time.tzname, time.timezone, time.daylight to
# match a pytz zone.
warnings.warn("Had to fall back to worst detection method (the 'PHP' "

tz = _detect_timezone_php()
if tz is not None:
return tz

raise pytz.UnknownTimeZoneError("Unable to detect your timezone!")

def _detect_timezone_environ():
if "TZ" in os.environ:
return pytz.timezone(os.environ["TZ"])
except (IOError, pytz.UnknownTimeZoneError):
warnings.warn("You provided a TZ environment value (%r) we did not "
"understand!" % os.environ["TZ"])

def _detect_timezone_etc_timezone():
if os.path.exists("/etc/timezone"):
tz = file("/etc/timezone").read().strip()
return pytz.timezone(tz)
except (IOError, pytz.UnknownTimeZoneError) as ei:
warnings.warn("Your /etc/timezone file references a timezone (%r) that"
" is not valid (%r)." % (tz, ei))

# Problem reading the /etc/timezone file
except IOError as eo:
warnings.warn("Could not access your /etc/timezone file: %s" % eo)

def _detect_timezone_etc_localtime():
matches = []
if os.path.exists("/etc/localtime"):
localtime = pytz.tzfile.build_tzinfo("/etc/localtime",

# See if we can find a "Human Name" for this..
for tzname in pytz.all_timezones:
tz = _tzinfome(tzname)

if dir(tz) != dir(localtime):

for attrib in dir(tz):
# Ignore functions and specials
if callable(getattr(tz, attrib)) or attrib.startswith("__"):

# This will always be different
if attrib == "zone" or attrib == "_tzinfos":

if getattr(tz, attrib) != getattr(localtime, attrib):

# We get here iff break didn't happen, i.e. no meaningful attributes
# differ between tz and localtime

if len(matches) == 1:
return _tzinfome(matches[0])
# Warn the person about this!
warning = "Could not get a human name for your timezone: "
if len(matches) > 1:
warning += ("We detected multiple matches for your /etc/localtime. "
"(Matches where %s)" % matches)
return _tzinfome(matches[0])
warning += "We detected no matches for your /etc/localtime."

# Register /etc/localtime as the timezone loaded.
pytz._tzinfo_cache['/etc/localtime'] = localtime
return localtime

def _detect_timezone_php():
tomatch = (time.tzname[0], time.timezone, time.daylight)
now =

matches = []
for tzname in pytz.all_timezones:
tz = pytz.timezone(tzname)
except IOError:

indst = tz.localize(now).timetuple()[-1]

if tomatch == (tz._tzname, -tz._utcoffset.seconds, indst):

# pylint: disable-msg=W0704
except AttributeError:

if len(matches) > 1:
warnings.warn("We detected multiple matches for the timezone, choosing "
"the first %s. (Matches where %s)" % (matches[0], matches))
return pytz.timezone(matches[0])

class datetime_tz(datetime.datetime):
"""An extension of the inbuilt datetime adding more functionality.

The extra functionality includes:
* Partial parsing support (IE 2006/02/30 matches %Y/%M/%D %H:%M)
* Full integration with pytz (just give it the string of the timezone!)
* Proper support for going to/from Unix timestamps (which are in UTC!).
__slots__ = ["is_dst"]

def __new__(cls, *args, **kw):
args = list(args)
if not args:
raise TypeError("Not enough arguments given.")

# See if we are given a tzinfo object...
tzinfo = None
if isinstance(args[-1], (datetime.tzinfo, str)):
tzinfo = _tzinfome(args.pop(-1))
elif kw.get("tzinfo", None) is not None:
tzinfo = _tzinfome(kw.pop("tzinfo"))

# Create a datetime object if we don't have one
if isinstance(args[0], datetime.datetime):
# Convert the datetime instance to a datetime object.
newargs = (list(args[0].timetuple()[0:6]) +
[args[0].microsecond, args[0].tzinfo])
dt = datetime.datetime(*newargs)

if tzinfo is None and dt.tzinfo is None:
raise TypeError("Must specify a timezone!")

if tzinfo is not None and dt.tzinfo is not None:
raise TypeError("Can not give a timezone with timezone aware"
" datetime object! (Use localize.)")
dt = datetime.datetime(*args, **kw)

if dt.tzinfo is not None:
# Re-normalize the dt object
dt = dt.tzinfo.normalize(dt)

if tzinfo is None:
tzinfo = localtz()

dt = tzinfo.localize(dt, is_dst=None)
except pytz.AmbiguousTimeError:
is_dst = None
if "is_dst" in kw:
is_dst = kw.pop("is_dst")

dt = tzinfo.localize(dt, is_dst)
except IndexError:
raise pytz.AmbiguousTimeError("No such time exists!")

newargs = list(dt.timetuple()[0:6])+[dt.microsecond, dt.tzinfo]
obj = datetime.datetime.__new__(cls, *newargs)
obj.is_dst = obj.dst() != datetime.timedelta(0)
return obj

def asdatetime(self, naive=True):
"""Return this datetime_tz as a datetime object.

naive: Return *without* any tz info.

This datetime_tz as a datetime object.
args = list(self.timetuple()[0:6])+[self.microsecond]
if not naive:
return datetime.datetime(*args)

def asdate(self):
"""Return this datetime_tz as a date object.

This datetime_tz as a date object.
return, self.month,

def totimestamp(self):
"""Convert this datetime object back to a unix timestamp.

The Unix epoch is the time 00:00:00 UTC on January 1, 1970.

Unix timestamp.
return calendar.timegm(self.utctimetuple())+1e-6*self.microsecond

def astimezone(self, tzinfo):
"""Returns a version of this timestamp converted to the given timezone.

tzinfo: Either a datetime.tzinfo object or a string (which will be looked
up in pytz.

A datetime_tz object in the given timezone.
# Assert we are not a naive datetime object
assert self.tzinfo is not None

tzinfo = _tzinfome(tzinfo)

d = self.asdatetime(naive=False).astimezone(tzinfo)
return datetime_tz(d)

# pylint: disable-msg=C6113
def replace(self, **kw):
"""Return datetime with new specified fields given as arguments.

For example, dt.replace(days=4) would return a new datetime_tz object with
exactly the same as dt but with the days attribute equal to 4.

Any attribute can be replaced, but tzinfo can not be set to None.

Any datetime_tz attribute.

A datetime_tz object with the attributes replaced.

TypeError: If the given replacement is invalid.
if "tzinfo" in kw:
if kw["tzinfo"] is None:
raise TypeError("Can not remove the timezone use asdatetime()")

is_dst = None
if "is_dst" in kw:
is_dst = kw["is_dst"]
del kw["is_dst"]
# Use our own DST setting..
is_dst = self.is_dst

replaced = self.asdatetime().replace(**kw)

return datetime_tz(replaced,, is_dst=is_dst)

# pylint: disable-msg=C6310
def smartparse(cls, toparse, tzinfo=None):
"""Method which uses dateutil.parse and extras to try and parse the string.

Valid dates are found at:

Other valid formats include:
"now" or "today"
"5 minutes ago"
"10 hours ago"
"10h5m ago"
"start of yesterday"
"end of tommorrow"
"end of 3rd of March"

toparse: The string to parse.
tzinfo: Timezone for the resultant datetime_tz object should be in.
(Defaults to your local timezone.)

New datetime_tz object.

ValueError: If unable to make sense of the input.
# Default for empty fields are:
# year/month/day == now
# hour/minute/second/microsecond == 0
toparse = toparse.strip()

if tzinfo is None:
dt =
dt =

default = dt.replace(hour=0, minute=0, second=0, microsecond=0)

# Remove "start of " and "end of " prefix in the string
if toparse.lower().startswith("end of "):
toparse = toparse[7:].strip()

dt += datetime.timedelta(days=1)
dt = dt.replace(hour=0, minute=0, second=0, microsecond=0)
dt -= datetime.timedelta(microseconds=1)

default = dt

elif toparse.lower().startswith("start of "):
toparse = toparse[9:].strip()

dt = dt.replace(hour=0, minute=0, second=0, microsecond=0)
default = dt

# Handle strings with "now", "today", "yesterday", "tomorrow" and "ago".
# Need to use lowercase
toparselower = toparse.lower()

if toparselower in ["now", "today"]:

elif toparselower == "yesterday":
dt -= datetime.timedelta(days=1)

elif toparselower == "tommorrow":
dt += datetime.timedelta(days=1)

elif "ago" in toparselower:
# Remove the "ago" bit
toparselower = toparselower[:-3]
# Replace all "a day and an hour" with "1 day 1 hour"
toparselower = toparselower.replace("a ", "1 ")
toparselower = toparselower.replace("an ", "1 ")
toparselower = toparselower.replace(" and ", " ")

# Match the following
# 1 hour ago
# 1h ago
# 1 h ago
# 1 hour ago
# 2 hours ago
# Same with minutes, seconds, etc.

tocheck = ("seconds", "minutes", "hours", "days", "weeks", "months",
result = {}
for match in re.finditer("([0-9]+)([^0-9]*)", toparselower):
amount = int(
unit =

for bit in tocheck:
regex = "^([%s]|((%s)s?))$" % (
bit[0], bit[:-1])

bitmatch =, unit)
if bitmatch:
result[bit] = amount
raise ValueError("Was not able to parse date unit %r!" % unit)

delta = dateutil.relativedelta.relativedelta(**result)
dt -= delta

# Handle strings with normal datetime format, use original case.
dt = dateutil.parser.parse(toparse, default=default.asdatetime(),
if dt is None:
raise ValueError("Was not able to parse date!")

if dt.tzinfo is pytz_abbr.unknown:
dt = dt.replace(tzinfo=None)

if dt.tzinfo is None:
if tzinfo is None:
tzinfo = localtz()
dt = cls(dt, tzinfo)
if isinstance(dt.tzinfo, pytz_abbr.tzabbr):
abbr = dt.tzinfo
dt = dt.replace(tzinfo=None)
dt = cls(dt,, is_dst=abbr.dst)

dt = cls(dt)

return dt

def utcfromtimestamp(cls, timestamp):
"""Returns a datetime object of a given timestamp (in UTC)."""
obj = datetime.datetime.utcfromtimestamp(timestamp)
obj = pytz.utc.localize(obj)
return cls(obj)

def fromtimestamp(cls, timestamp):
"""Returns a datetime object of a given timestamp (in local tz)."""
d = cls.utcfromtimestamp(timestamp)
return d.astimezone(localtz())

def utcnow(cls):
"""Return a new datetime representing UTC day and time."""
obj = datetime.datetime.utcnow()
obj = cls(obj, tzinfo=pytz.utc)
return obj

def now(cls, tzinfo=None):
"""[tz] -> new datetime with tz's local day and time."""
obj = cls.utcnow()
if tzinfo is None:
tzinfo = localtz()
return obj.astimezone(tzinfo)

today = now

def fromordinal(ordinal):
raise SyntaxError("Not enough information to create a datetime_tz object "
"from an ordinal. Please use")

class iterate(object):
"""Helpful iterators for working with datetime_tz objects."""

def between(start, delta, end=None):
"""Return an iterator between this date till given end point.

Example usage:
>>> d = datetime_tz.smartparse("5 days ago")
2008/05/12 11:45
>>> for i in d.between(timedelta(days=1),
>>> print i
2008/05/12 11:45
2008/05/13 11:45
2008/05/14 11:45
2008/05/15 11:45
2008/05/16 11:45

start: The date to start at.
delta: The interval to iterate with.
end: (Optional) Date to end at. If not given the iterator will never

datetime_tz objects.
toyield = start
while end is None or toyield < end:
yield toyield
toyield += delta

def weeks(start, end=None):
"""Iterate over the weeks between the given datetime_tzs.

start: datetime_tz to start from.
end: (Optional) Date to end at, if not given the iterator will never

An iterator which generates datetime_tz objects a week apart.
return iterate.between(start, datetime.timedelta(days=7), end)

def days(start, end=None):
"""Iterate over the days between the given datetime_tzs.

start: datetime_tz to start from.
end: (Optional) Date to end at, if not given the iterator will never

An iterator which generates datetime_tz objects a day apart.
return iterate.between(start, datetime.timedelta(days=1), end)

def hours(start, end=None):
"""Iterate over the hours between the given datetime_tzs.

start: datetime_tz to start from.
end: (Optional) Date to end at, if not given the iterator will never

An iterator which generates datetime_tz objects a hour apart.
return iterate.between(start, datetime.timedelta(hours=1), end)

def minutes(start, end=None):
"""Iterate over the minutes between the given datetime_tzs.

start: datetime_tz to start from.
end: (Optional) Date to end at, if not given the iterator will never

An iterator which generates datetime_tz objects a minute apart.
return iterate.between(start, datetime.timedelta(minutes=1), end)

def seconds(start, end=None):
"""Iterate over the seconds between the given datetime_tzs.

start: datetime_tz to start from.
end: (Optional) Date to end at, if not given the iterator will never

An iterator which generates datetime_tz objects a second apart.
return iterate.between(start, datetime.timedelta(minutes=1), end)

def _wrap_method(name):
"""Wrap a method.

Patch a method which might return a datetime.datetime to return a
datetime_tz.datetime_tz instead.

name: The name of the method to patch
method = getattr(datetime.datetime, name)

# Have to give the second argument as method has no __module__ option.
@functools.wraps(method, ("__name__", "__doc__"), ())
def wrapper(*args, **kw):
r = method(*args, **kw)

if isinstance(r, datetime.datetime) and not isinstance(r, datetime_tz):
r = datetime_tz(r)
return r

setattr(datetime_tz, name, wrapper)

for methodname in ["__add__", "__radd__", "__rsub__", "__sub__", "combine"]:

# Make sure we have not already got an override for this method
assert methodname not in datetime_tz.__dict__


__all__ = ['datetime_tz', 'detect_timezone', 'iterate', 'localtz',
'localtz_set', 'timedelta', '_detect_timezone_environ',
'_detect_timezone_etc_localtime', '_detect_timezone_etc_timezone',

+ 0
- 230
nilmdb/utils/datetime_tz/ View File

@@ -1,230 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2010 Google Inc. All Rights Reserved.

Common time zone acronyms/abbreviations for use with the datetime_tz module.

*WARNING*: There are lots of caveats when using this module which are listed

CAVEAT 1: The acronyms/abbreviations are not globally unique, they are not even
unique within a region. For example, EST can mean any of,
Eastern Standard Time in Australia (which is 10 hour ahead of UTC)
Eastern Standard Time in North America (which is 5 hours behind UTC)

Where there are two abbreviations the more popular one will appear in the all
dictionary, while the less common one will only appear in that countries region
dictionary. IE If using all, EST will be mapped to Eastern Standard Time in
North America.

CAVEAT 2: Many of the acronyms don't map to a neat Oslon timezones. For example,
Eastern European Summer Time (EEDT) is used by many different countries in
Europe *at different times*! If the acronym does not map neatly to one zone it
is mapped to the Etc/GMT+-XX Oslon zone. This means that any date manipulations
can end up with idiot things like summer time in the middle of winter.

CAVEAT 3: The Summer/Standard time difference is really important! For an hour
each year it is needed to determine which time you are actually talking about.
2002-10-27 01:20:00 EST != 2002-10-27 01:20:00 EDT

import datetime
import pytz
import pytz.tzfile

class tzabbr(datetime.tzinfo):
"""A timezone abbreviation.

*WARNING*: This is not a tzinfo implementation! Trying to use this as tzinfo
object will result in failure. We inherit from datetime.tzinfo so we can get
through the dateutil checks.

# A "marker" tzinfo object which is used to signify an unknown timezone.
unknown = datetime.tzinfo(0)

regions = {'all': {}, 'military': {}}
# Create a special alias for the all and military regions
all = regions['all']
military = regions['military']

def tzabbr_register(abbr, name, region, zone, dst):
"""Register a new timezone abbreviation in the global registry.

If another abbreviation with the same name has already been registered it new
abbreviation will only be registered in region specific dictionary.
newabbr = tzabbr()
newabbr.abbr = abbr = name
newabbr.region = region = zone
newabbr.dst = dst

if abbr not in all:
all[abbr] = newabbr

if not region in regions:
regions[region] = {}

assert abbr not in regions[region]
regions[region][abbr] = newabbr

def tzinfos_create(use_region):
abbrs = regions[use_region]

def tzinfos(abbr, offset):
if abbr:
if abbr in abbrs:
result = abbrs[abbr]
if offset:
# FIXME: Check the offset matches the abbreviation we just selected.
return result
raise ValueError("Unknown timezone found %s" % abbr)
if offset == 0:
return pytz.utc
if offset:
return pytz.FixedOffset(offset/60)
return unknown

return tzinfos

# Create a special alias for the all tzinfos
tzinfos = tzinfos_create('all')

# Create the abbreviations.
# *WARNING*: Order matters!
tzabbr_register("A", "Alpha Time Zone", "Military", "Etc/GMT-1", False)
tzabbr_register("ACDT", "Australian Central Daylight Time", "Australia",
"Australia/Adelaide", True)
tzabbr_register("ACST", "Australian Central Standard Time", "Australia",
"Australia/Adelaide", False)
tzabbr_register("ADT", "Atlantic Daylight Time", "North America",
"America/Halifax", True)
tzabbr_register("AEDT", "Australian Eastern Daylight Time", "Australia",
"Australia/Sydney", True)
tzabbr_register("AEST", "Australian Eastern Standard Time", "Australia",
"Australia/Sydney", False)
tzabbr_register("AKDT", "Alaska Daylight Time", "North America",
"US/Alaska", True)
tzabbr_register("AKST", "Alaska Standard Time", "North America",
"US/Alaska", False)
tzabbr_register("AST", "Atlantic Standard Time", "North America",
"America/Halifax", False)
tzabbr_register("AWDT", "Australian Western Daylight Time", "Australia",
"Australia/West", True)
tzabbr_register("AWST", "Australian Western Standard Time", "Australia",
"Australia/West", False)
tzabbr_register("B", "Bravo Time Zone", "Military", "Etc/GMT-2", False)
tzabbr_register("BST", "British Summer Time", "Europe", "Europe/London", True)
tzabbr_register("C", "Charlie Time Zone", "Military", "Etc/GMT-2", False)
tzabbr_register("CDT", "Central Daylight Time", "North America",
"US/Central", True)
tzabbr_register("CEDT", "Central European Daylight Time", "Europe",
"Etc/GMT+2", True)
tzabbr_register("CEST", "Central European Summer Time", "Europe",
"Etc/GMT+2", True)
tzabbr_register("CET", "Central European Time", "Europe", "Etc/GMT+1", False)
tzabbr_register("CST", "Central Standard Time", "North America",
"US/Central", False)
tzabbr_register("CXT", "Christmas Island Time", "Australia",
"Indian/Christmas", False)
tzabbr_register("D", "Delta Time Zone", "Military", "Etc/GMT-2", False)
tzabbr_register("E", "Echo Time Zone", "Military", "Etc/GMT-2", False)
tzabbr_register("EDT", "Eastern Daylight Time", "North America",
"US/Eastern", True)
tzabbr_register("EEDT", "Eastern European Daylight Time", "Europe",
"Etc/GMT+3", True)
tzabbr_register("EEST", "Eastern European Summer Time", "Europe",
"Etc/GMT+3", True)
tzabbr_register("EET", "Eastern European Time", "Europe", "Etc/GMT+2", False)
tzabbr_register("EST", "Eastern Standard Time", "North America",
"US/Eastern", False)
tzabbr_register("F", "Foxtrot Time Zone", "Military", "Etc/GMT-6", False)
tzabbr_register("G", "Golf Time Zone", "Military", "Etc/GMT-7", False)
tzabbr_register("GMT", "Greenwich Mean Time", "Europe", pytz.utc, False)
tzabbr_register("H", "Hotel Time Zone", "Military", "Etc/GMT-8", False)
#tzabbr_register("HAA", u"Heure Avancée de l'Atlantique", u"North America", u"UTC - 3 hours")
#tzabbr_register("HAC", u"Heure Avancée du Centre", u"North America", u"UTC - 5 hours")
tzabbr_register("HADT", "Hawaii-Aleutian Daylight Time", "North America",
"Pacific/Honolulu", True)
#tzabbr_register("HAE", u"Heure Avancée de l'Est", u"North America", u"UTC - 4 hours")
#tzabbr_register("HAP", u"Heure Avancée du Pacifique", u"North America", u"UTC - 7 hours")
#tzabbr_register("HAR", u"Heure Avancée des Rocheuses", u"North America", u"UTC - 6 hours")
tzabbr_register("HAST", "Hawaii-Aleutian Standard Time", "North America",
"Pacific/Honolulu", False)
#tzabbr_register("HAT", u"Heure Avancée de Terre-Neuve", u"North America", u"UTC - 2:30 hours")
#tzabbr_register("HAY", u"Heure Avancée du Yukon", u"North America", u"UTC - 8 hours")
tzabbr_register("HDT", "Hawaii Daylight Time", "North America",
"Pacific/Honolulu", True)
#tzabbr_register("HNA", u"Heure Normale de l'Atlantique", u"North America", u"UTC - 4 hours")
#tzabbr_register("HNC", u"Heure Normale du Centre", u"North America", u"UTC - 6 hours")
#tzabbr_register("HNE", u"Heure Normale de l'Est", u"North America", u"UTC - 5 hours")
#tzabbr_register("HNP", u"Heure Normale du Pacifique", u"North America", u"UTC - 8 hours")
#tzabbr_register("HNR", u"Heure Normale des Rocheuses", u"North America", u"UTC - 7 hours")
#tzabbr_register("HNT", u"Heure Normale de Terre-Neuve", u"North America", u"UTC - 3:30 hours")
#tzabbr_register("HNY", u"Heure Normale du Yukon", u"North America", u"UTC - 9 hours")
tzabbr_register("HST", "Hawaii Standard Time", "North America",
"Pacific/Honolulu", False)
tzabbr_register("I", "India Time Zone", "Military", "Etc/GMT-9", False)
tzabbr_register("IST", "Irish Summer Time", "Europe", "Europe/Dublin", True)
tzabbr_register("K", "Kilo Time Zone", "Military", "Etc/GMT-10", False)
tzabbr_register("L", "Lima Time Zone", "Military", "Etc/GMT-11", False)
tzabbr_register("M", "Mike Time Zone", "Military", "Etc/GMT-12", False)
tzabbr_register("MDT", "Mountain Daylight Time", "North America",
"US/Mountain", True)
#tzabbr_register("MESZ", u"Mitteleuroäische Sommerzeit", u"Europe", u"UTC + 2 hours")
#tzabbr_register("MEZ", u"Mitteleuropäische Zeit", u"Europe", u"UTC + 1 hour")
tzabbr_register("MSD", "Moscow Daylight Time", "Europe",
"Europe/Moscow", True)
tzabbr_register("MSK", "Moscow Standard Time", "Europe",
"Europe/Moscow", False)
tzabbr_register("MST", "Mountain Standard Time", "North America",
"US/Mountain", False)
tzabbr_register("N", "November Time Zone", "Military", "Etc/GMT+1", False)
tzabbr_register("NDT", "Newfoundland Daylight Time", "North America",
"America/St_Johns", True)
tzabbr_register("NFT", "Norfolk (Island) Time", "Australia",
"Pacific/Norfolk", False)
tzabbr_register("NST", "Newfoundland Standard Time", "North America",
"America/St_Johns", False)
tzabbr_register("O", "Oscar Time Zone", "Military", "Etc/GMT+2", False)
tzabbr_register("P", "Papa Time Zone", "Military", "Etc/GMT+3", False)
tzabbr_register("PDT", "Pacific Daylight Time", "North America",
"US/Pacific", True)
tzabbr_register("PST", "Pacific Standard Time", "North America",
"US/Pacific", False)
tzabbr_register("Q", "Quebec Time Zone", "Military", "Etc/GMT+4", False)
tzabbr_register("R", "Romeo Time Zone", "Military", "Etc/GMT+5", False)
tzabbr_register("S", "Sierra Time Zone", "Military", "Etc/GMT+6", False)
tzabbr_register("T", "Tango Time Zone", "Military", "Etc/GMT+7", False)
tzabbr_register("U", "Uniform Time Zone", "Military", "Etc/GMT+8", False)
tzabbr_register("UTC", "Coordinated Universal Time", "Europe",
pytz.utc, False)
tzabbr_register("V", "Victor Time Zone", "Military", "Etc/GMT+9", False)
tzabbr_register("W", "Whiskey Time Zone", "Military", "Etc/GMT+10", False)
tzabbr_register("WDT", "Western Daylight Time", "Australia",
"Australia/West", True)
tzabbr_register("WEDT", "Western European Daylight Time", "Europe",
"Etc/GMT+1", True)
tzabbr_register("WEST", "Western European Summer Time", "Europe",
"Etc/GMT+1", True)
tzabbr_register("WET", "Western European Time", "Europe", pytz.utc, False)
tzabbr_register("WST", "Western Standard Time", "Australia",
"Australia/West", False)
tzabbr_register("X", "X-ray Time Zone", "Military", "Etc/GMT+11", False)
tzabbr_register("Y", "Yankee Time Zone", "Military", "Etc/GMT+12", False)
tzabbr_register("Z", "Zulu Time Zone", "Military", pytz.utc, False)

+ 1
- 3
nilmdb/utils/ View File

@@ -1,6 +1,4 @@

from nilmdb.utils import datetime_tz
import datetime_tz
import re
import time

+ 1
- 1
nilmdb/utils/ View File

@@ -69,7 +69,7 @@ class TimestamperRate(Timestamper):
while True:
now = start + rate_to_period(rate, n)
if end and now >= end:
raise StopIteration
yield timestamp_to_string(now) + " "
n += 1
Timestamper.__init__(self, infile, iterator(start, rate, end))

+ 1
- 1
tests/ View File

@@ -2,7 +2,7 @@

import nilmdb
from nilmdb.utils.printf import *
from nilmdb.utils import datetime_tz
import datetime_tz

from import *
from import assert_raises

+ 1
- 1
tests/ View File

@@ -1,6 +1,6 @@
import nilmdb
from nilmdb.utils.printf import *
from nilmdb.utils import datetime_tz
import datetime_tz

from import *
from import assert_raises