Matplotlib autodatelocator пользовательское форматирование даты? - PullRequest
2 голосов
/ 09 июня 2010

Я использую 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

Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 09 июня 2010

AutoDateFormatter делает то, что вы хотите? Даже если это не так, возможно, вы захотите взглянуть на его исходный код для более компактного способа реализации выбора формата строки.

В выпущенной версии вы не можете настроить форматы для уровня, но в код разработки вы можете. Возможно, вы могли бы просто скопировать версию из транка в свой собственный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...