Я только что выпустил библиотеку Python под названием Fleming (https://github.com/ambitioninc/fleming),), и она, похоже, решает две ваши проблемы с изощренностью в отношении перехода на летнее время.
Проблема 1. Арифметика. У Флеминга есть функция add_timedelta, которая берет timedelta (из модуля datetime Python) или относительную delta из python-dateutil и добавляет его к объекту datetime. Функция add_timedelta обрабатывает случай, когда объект datetime пересекает границу DST. Проверьте https://github.com/ambitioninc/fleming#add_timedelta для полного объяснения и примеров. Вот краткий пример:
import fleming
import datetime
import timedelta
dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=2, days=1))
print dt
2013-03-29 20:00:00-04:00
# Do timedelta arithmetic such that it starts in DST and crosses over into no DST.
# Note that the hours stay in tact and the timezone changes
dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=-4))
print dt
2013-03-01 20:00:00-05:00
Проблема 2. Естественное выравнивание границ. У Флеминга есть функция пола, которая может принимать произвольное выравнивание. Допустим, ваше время было datetime (2013, 2, 3) и вы указали минимальный интервал месяца = 3. Это означает, что он будет округляться до ближайшего триместра (квартала). Вы также можете указать ближайшее десятилетие, используя год = 10 в аргументах. Проверьте (https://github.com/ambitioninc/fleming#floordt-within_tznone-yearnone-monthnone-weeknone-daynone-hournone-minutenone-secondnone-microsecondnone) для полных примеров и иллюстраций. Вот быстрый:
import fleming
import datetime
# Get the starting of a quarter by using month=3
print fleming.floor(datetime.datetime(2013, 2, 4), month=3)
2013-01-01 00:00:00