plot time of day vs date in matplotlib

前端 未结 2 1302
一整个雨季
一整个雨季 2020-12-19 08:48

I want to plot, in a specific few ways, dates on the x axis and time of day on the y axis, and then have either line plots or interval (floating bar) plots.

This S

相关标签:
2条回答
  • 2020-12-19 09:29

    I think you're slightly confused as to exactly how matplotlib handles times and dates behind the scenes.

    All datetimes in matplotlib are represented as simple floats. 1 day corresponds to a difference of 1.0, and the dates are in days since 1900 (if I remember correctly, anyway).

    So, in order to plot just the time of a given date, you need to use a % 1.

    I'm going to use points, but you can easily use bars. Look into using the bottom keyword argument if you do use plt.bar, so that the bottom of the bars will start at the start time of your intervals (and remember that the second argument is the height of the bar, not its top y-value).

    For example:

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    import numpy as np
    import datetime as dt
    
    # Make a series of events 1 day apart
    x = mpl.dates.drange(dt.datetime(2009,10,1), 
                         dt.datetime(2010,1,15), 
                         dt.timedelta(days=1))
    # Vary the datetimes so that they occur at random times
    # Remember, 1.0 is equivalent to 1 day in this case...
    x += np.random.random(x.size)
    
    # We can extract the time by using a modulo 1, and adding an arbitrary base date
    times = x % 1 + int(x[0]) # (The int is so the y-axis starts at midnight...)
    
    # I'm just plotting points here, but you could just as easily use a bar.
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot_date(x, times, 'ro')
    ax.yaxis_date()
    fig.autofmt_xdate()
    
    plt.show()
    

    Time vs. Date

    Hopefully that helps a bit!

    0 讨论(0)
  • 2020-12-19 09:44

    Follow Joe Kingston's response, but I'd add that you need to convert your date strings into datetime objects, which can easily be done with the datetime module, and then convert them to matplotlib dates represented as floats (which can then be formatted as desired).

    import datetime as dt
    import matplotlib as mpl
    
    some_time_str = '2010-12-20 05:00:00'
    some_time_dt = dt.datetime.strptime(some_time_str, '%Y-%m-%d %H:%M:%S')
    some_time_num = mpl.dates.date2num(some_time_dt) # 734126.20833333337
    

    If you start with an array filled with time strings, you can do something like:

    time_str_list = ['2010-12-20 05:00:00','2010-12-20 05:30:00']
    time_num_list = map(
        lambda x: mpl.dates.date2num(dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')),
        time_str_list) #[734126.20833333337, 734126.22916666663]
    
    0 讨论(0)
提交回复
热议问题