def parse(cls, string):
tzinfo = None
if string == 'local':
tzinfo = tz.tzlocal()
elif string in ['utc', 'UTC']:
tzinfo = tz.tzutc()
else:
iso_match = cls._TZINFO_RE.match(string)
if iso_match:
sign, hours, minutes = iso_match.groups()
if minutes is None:
minutes = 0
seconds = int(hours) * 3600 + int(minutes) * 60
if sign == '-':
seconds *= -1
tzinfo = tz.tzoffset(None, seconds)
else:
tzinfo = tz.gettz(string)
if tzinfo is None:
raise ParserError('Could not parse timezone expression "{0}"', string)
return tzinfo
python类tzoffset()的实例源码
def test_dumps_aware_datetime():
assert dumps(
{"key": "value"},
timestamp=datetime.fromtimestamp(1473703254, tzoffset('PDT', -25200))
) == '#Mon Sep 12 11:00:54 PDT 2016\nkey=value\n'
def _timestamp_to_iso_format(timestamp, offset_hours=0):
try:
pseudo_timezone = tz.tzoffset('Unknown', int(offset_hours * 3600))
return datetime.fromtimestamp(timestamp, pseudo_timezone).isoformat()
except:
raise
return None
def test_make_date():
d = datetime.date(2000, 1, 1)
assert make_date(d) == d
d2 = datetime.datetime(2000, 1, 1, 0, 0)
assert make_date(d2) == d
d3 = '2000-01-01T00:00:00.000000Z'
assert make_date(d3) == d
test_tz = pytz.timezone('America/Cancun')
assert make_date(d3, test_tz) != d
test_tz = tz.tzoffset('IST', -3600)
assert make_date(d3, test_tz) != d
def test_format_date():
test_tz = tz.tzoffset('IST', -3600)
f = I18nFormatter('fr', test_tz)
d = '2000-01-01T00:00:00.000000Z'
assert f.format('Posté le {post_date:date:medium}', post_date=d) == \
'Posté le 1 janv. 2000'
def get_timezone(self) -> Optional[tzinfo]:
"""
We can't exactly know the time zone of the user from what Facebook
gives (fucking morons) but we can still give something that'll work
until next DST.
"""
u = await self._get_user()
diff = float(u.get('timezone', 0)) * 3600.0
return tz.tzoffset('ITC', diff)
def parse(cls, string):
tzinfo = None
if string == 'local':
tzinfo = tz.tzlocal()
elif string in ['utc', 'UTC']:
tzinfo = tz.tzutc()
else:
iso_match = cls._TZINFO_RE.match(string)
if iso_match:
sign, hours, minutes = iso_match.groups()
if minutes is None:
minutes = 0
seconds = int(hours) * 3600 + int(minutes) * 60
if sign == '-':
seconds *= -1
tzinfo = tz.tzoffset(None, seconds)
else:
tzinfo = tz.gettz(string)
if tzinfo is None:
raise ParserError('Could not parse timezone expression "{0}"'.format(string))
return tzinfo
def test_datetime(self):
check = DateTime()
self.assertEqual(check('2017-09-01 23:59'),
datetime.datetime(2017, 9, 1, 23, 59))
self.assertEqual(
check('Fri Sep 1 23:59:59 UTC 2017'),
datetime.datetime(2017, 9, 1, 23, 59, 59, tzinfo=tzutc()))
self.assertEqual(
check('Fri Sep 1 23:59:59 2017'),
datetime.datetime(2017, 9, 1, 23, 59, 59))
self.assertEqual(
check('Fri, 1 Sep 2017 23:59:59 -0300'),
datetime.datetime(2017, 9, 1, 23, 59, 59,
tzinfo=tzoffset(None, -10800)))
self.assertEqual(
check('2017-09-01T23:59:59.5-03:00'),
datetime.datetime(2017, 9, 1, 23, 59, 59, 500000,
tzinfo=tzoffset(None, -10800)))
self.assertEqual(
check('20170901T235959.5-0300'),
datetime.datetime(2017, 9, 1, 23, 59, 59, 500000,
tzinfo=tzoffset(None, -10800)))
self.assertEqual(
check('20170901T235959-0300'),
datetime.datetime(2017, 9, 1, 23, 59, 59,
tzinfo=tzoffset(None, -10800)))
self.assertEqual(check('2017-09-01T23:59:59'),
datetime.datetime(2017, 9, 1, 23, 59, 59))
self.assertEqual(check('20170901T235959'),
datetime.datetime(2017, 9, 1, 23, 59, 59))
self.assertEqual(check('20170901235959'),
datetime.datetime(2017, 9, 1, 23, 59, 59))
self.assertEqual(check('2017-09-01T23:59'),
datetime.datetime(2017, 9, 1, 23, 59))
self.assertEqual(check('20170901T2359'),
datetime.datetime(2017, 9, 1, 23, 59))
self.assertEqual(check('2017-09-01T23'),
datetime.datetime(2017, 9, 1, 23))
self.assertEqual(check('20170901T23'),
datetime.datetime(2017, 9, 1, 23))
self.assertEqual(check('2017-09-01'),
datetime.datetime(2017, 9, 1))
self.assertEqual(check('20170901'),
datetime.datetime(2017, 9, 1))
self.assertEqual(check('09-01-2017'),
datetime.datetime(2017, 9, 1))
self.assertEqual(check('09-01-17'),
datetime.datetime(2017, 9, 1))
self.assertEqual(check('2017.Sep.01'),
datetime.datetime(2017, 9, 1))
self.assertEqual(check('2017/09/01'),
datetime.datetime(2017, 9, 1))
self.assertEqual(check('2017 09 01'),
datetime.datetime(2017, 9, 1))
self.assertEqual(check('1st of September 2017'),
datetime.datetime(2017, 9, 1))
# Note: to equality here we need to pass extra params to parse() method
self.assertNotEqual(check('01-09-2017'),
datetime.datetime(2017, 9, 1))
def process_item(self, item, spider):
times = {
'timestampSent': 'timeSent',
'timestampReceived': 'timeReceived'
}
time_format = "%Y-%m-%d %H:%M:%S%z"
# Define a default time zone according to the email server setting
if spider.name == 'hypermail':
def_tz = tz.tzoffset('EST', -18000)
elif spider.name == 'marc':
def_tz = tz.tzoffset('EDT', -14400)
for key, val in times.items():
if item[val] == "":
item[val] = "NA"
item[key] = "NA"
continue
try:
parsed_time = dateParser(item[val])
except ValueError:
try:
# "... HH:MM:SS +0200"
pattern = r'(.* \d{2}:\d{2}:\d{2}(\s?[+,-]\d{4})?)'
simpler = re.search(pattern, item[val])
parsed_time = dateParser(simpler.group(1))
except AttributeError:
message = '<' + item['url'] + '> '
message += 'ParseTimeFields could not parse ' + val + ', '
message += key + ' will be NA.'
LOGGER.warning(message)
item[key] = "NA"
continue
if parsed_time.tzinfo is None:
parsed_time = parsed_time.replace(tzinfo=def_tz)
item[key] = parsed_time.strftime(time_format)
return item
def test():
from io import BytesIO
x = [datetime.datetime(2017, 4, 6, 0, 0), datetime.datetime(2017, 4, 7, 0, 0), datetime.datetime(2017, 4, 8, 0, 0), datetime.datetime(2017, 4, 11, 0, 0), datetime.datetime(2017, 4, 12, 0, 0), datetime.datetime(2017, 4, 13, 0, 0), datetime.datetime(2017, 4, 14, 0, 0), datetime.datetime(2017, 4, 16, 0, 0), datetime.datetime(2017, 4, 17, 0, 0),
datetime.datetime(2017, 4, 18, 0, 0), datetime.datetime(2017, 4, 19, 0, 0), datetime.datetime(2017, 4, 20, 0, 0), datetime.datetime(2017, 4, 22, 0, 0), datetime.datetime(2017, 4, 23, 0, 0)]
y = [[0.0, 15.0, 9.0, 0.0, 9.0, 5.0, 6.0, 0.0, 11.0, 9.0, 5.0, 6.0, 0.0, 11.0],
[15.0, 17.0, 0.0, 20.0, 20.0, 19.0, 30.0, 32.0, 23.0, 20.0, 19.0, 30.0, 32.0, 23.0]]
grid = [
[{'date': datetime.datetime(2017, 4, 3, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 4, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 5, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 6, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 15.]}, {'date': datetime.datetime(2017, 4, 7, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 15., 17.]}, {'date': datetime.datetime(2017, 4, 8, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 9., 0.]}, {'date': datetime.datetime(2017, 4, 9, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}],
[{'date': datetime.datetime(2017, 4, 10, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 11, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 20.]}, {'date': datetime.datetime(2017, 4, 12, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 9., 20.]}, {'date': datetime.datetime(2017, 4, 13, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 5., 19.]}, {'date': datetime.datetime(2017, 4, 14, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 6., 30.]}, {'date': datetime.datetime(2017, 4, 15, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 16, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 32.]}],
[{'date': datetime.datetime(2017, 4, 17, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 11., 23.]}, {'date': datetime.datetime(2017, 4, 18, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 19, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 20, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 21, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 22, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 23, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}],
[{'date': datetime.datetime(2017, 4, 24, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 11., 23.]}, {'date': datetime.datetime(2017, 4, 25, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 26, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 27, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 28, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 29, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}, {'date': datetime.datetime(2017, 4, 30, 0, 0, tzinfo=tzoffset(None, 10800)), 'values': [ 0., 0.]}]
]
dashboard = {
"summary": "Anna work-out",
"empty_image": "../amazon-dash-private/images/old-woman.png",
"images_folder": "../amazon-dash-private/images/"
}
labels = [
{"summary": "Morning work-out", "image": "../amazon-dash-private/images/morning4.png"},
{"summary": "Physiotherapy", "image": "../amazon-dash-private/images/evening2.png"}
]
absent_labels = [
{'image_grid': '../amazon-dash-private/images/absent_ill_grid.png',
'image_plot': '../amazon-dash-private/images/absent_ill_plot.png',
'summary': 'Sick'},
{'image_grid': '../amazon-dash-private/images/absent_vacation_grid.png',
'image_plot': '../amazon-dash-private/images/absent_vacation_plot.png',
'summary': 'Vacation'}
]
weather = {'day': [datetime.datetime(2017, 4, 22, 0, 0),
datetime.datetime(2017, 4, 23, 0, 0),
datetime.datetime(2017, 4, 24, 0, 0),
datetime.datetime(2017, 4, 25, 0, 0)],
'icon': ['sct', 'ovc', 'hi_shwrs', 'sn'],
'temp_max': [6.64, 6.38, 4.07, 6.91],
'temp_min': [-0.58, -2.86, -1.87, -1.91],
'images_folder': '../amazon-dash-private/images/'}
t0 = datetime.datetime.now()
image_data = draw_calendar(grid, x, y, weather, dashboard, labels, absent_labels,
ImageParams(
dashboard='',
format='gif',
style='seaborn-talk',
xkcd=1,
rotate=0
)
)
t1 = datetime.datetime.now()
print(t1 - t0)
image_file = BytesIO(image_data)
image = PIL.Image.open(image_file)
image.show()
# with open('test.png', 'wb') as png_file:
# png_file.write(image)
#plt.show()
#todo speed it up. too many rescalings as I see from profiling.
# may be using artists (http://stackoverflow.com/questions/41453902/is-it-possible-to-patch-an-image-in-matplotlib)
# will reduce number of rescaling?
# now it looks like matplotlib rescales after each operation