Я использую Matplotlib для динамического создания диаграмм .png из базы данных. Пользователь может установить в качестве оси X любой заданный диапазон дат и времени, и мне нужно учитывать все это. В то время как Matplotlib имеет date.AutoDateLocator (), я хочу, чтобы формат даты и времени, напечатанный на диаграмме, зависел от контекста - например, если пользователь составляет график с 3 часов дня. до 5 часов вечера информация о году / месяце / дне отображаться не требуется. Сейчас я вручную создаю объекты Locator и Formatter таким образом:
def get_ticks(start, end):
from datetime import timedelta as td
delta = end - start
if delta <= td(minutes=10):
loc = mdates.MinuteLocator()
fmt = mdates.DateFormatter('%I:%M %p')
elif delta <= td(minutes=30):
loc = mdates.MinuteLocator(byminute=range(0,60,5))
fmt = mdates.DateFormatter('%I:%M %p')
elif delta <= td(hours=1):
loc = mdates.MinuteLocator(byminute=range(0,60,15))
fmt = mdates.DateFormatter('%I:%M %p')
elif delta <= td(hours=6):
loc = mdates.HourLocator()
fmt = mdates.DateFormatter('%I:%M %p')
elif delta <= td(days=1):
loc = mdates.HourLocator(byhour=range(0,24,3))
fmt = mdates.DateFormatter('%I:%M %p')
elif delta <= td(days=3):
loc = mdates.HourLocator(byhour=range(0,24,6))
fmt = mdates.DateFormatter('%I:%M %p')
elif delta <= td(weeks=2):
loc = mdates.DayLocator()
fmt = mdates.DateFormatter('%b %d')
elif delta <= td(weeks=12):
loc = mdates.WeekdayLocator()
fmt = mdates.DateFormatter('%b %d')
elif delta <= td(weeks=52):
loc = mdates.MonthLocator()
fmt = mdates.DateFormatter('%b')
else:
loc = mdates.MonthLocator(interval=3)
fmt = mdates.DateFormatter('%b %Y')
return loc,fmt
Есть ли лучший способ сделать это?