Skip to main content
 首页 » 编程设计

python之Matplotlib autodatelocator 自定义日期格式

2025年05月04日7bjzhanghao

我正在使用 Matplotlib 从数据库动态生成 .png 图表。用户可以将任何给定日期时间范围设置为 x 轴,我需要考虑所有这些。虽然 Matplotlib 有 dates.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 

有更好的方法吗?

请您参考如下方法:

是否AutoDateFormatter做你想做的事?即使没有,您也可能需要查看其源代码,以了解一种更紧凑的方式来实现格式字符串的选择。

在发布版本中,您不能自定义每级格式,但在development code你可以。您可能只需将版本从主干复制到您自己的代码中。