matplotlib 如何使用datetime.time来绘图

k4aesqcs  于 2023-11-22  发布在  其他
关注(0)|答案(3)|浏览(155)

我有一个HH:MM:SS格式的时间戳列表,想用datetime.time来绘制一些值。看起来python不喜欢我这样做。有人能帮忙吗?

import datetime
import matplotlib.pyplot as plt

# random data
x = [datetime.time(12,10,10), datetime.time(12, 11, 10)]
y = [1,5]

# plot
plt.plot(x,y)
plt.show()

*TypeError: float() argument must be a string or a number*

字符串

mkh04yzy

mkh04yzy1#

它在Python 3.5.3和Matplotlib 2.1.0中仍然有效。
解决方法是使用datetime.datetime对象而不是datetime.time对象:

import datetime
import matplotlib.pyplot as plt

# random data
x = [datetime.time(12,10,10), datetime.time(12, 11, 10)]
x_dt = [datetime.datetime.combine(datetime.date.today(), t) for t in x]
y = [1,5]

# plot
plt.plot(x_dt, y)
plt.show()

字符串


的数据
按最终日期部分不应可见。否则,您可以始终使用DateFormatter:

import matplotlib.dates as mdates
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H-%M-%S'))

vpfxa7rd

vpfxa7rd2#

好吧,一个两步的故事,让他们PLOT真的很好

x1c 0d1x的数据

第一步:将数据整理成合适的格式

datetimematplotlib约定兼容**float**的日期/时间
像往常一样,魔鬼隐藏在细节中。

matplotlib日期 * 几乎 * 相等,但相等:

#  mPlotDATEs.date2num.__doc__
#                  
#     *d* is either a class `datetime` instance or a sequence of datetimes.
#
#     Return value is a floating point number (or sequence of floats)
#     which gives the number of days (fraction part represents hours,
#     minutes, seconds) since 0001-01-01 00:00:00 UTC, *plus* *one*.
#     The addition of one here is a historical artifact.  Also, note
#     that the Gregorian calendar is assumed; this is not universal
#     practice.  For details, see the module docstring.

字符串
所以,强烈建议重新使用自己的“自己的”工具:

from matplotlib import dates as mPlotDATEs   # helper functions num2date()
#                                            #              and date2num()
#                                            #              to convert to/from.

第二步:管理轴标签和格式以及缩放(最小/最大)作为下一个问题

matplotlib也为你带来了这部分的武器。
检查code in this answer for all details

u91tlkcl

u91tlkcl3#

我有一个Pandas DataFrame df,包含datetimedf.dtm和数据列df.x,跨越几天,但我想使用matplotlib.pyplot作为时间的函数绘制它们,* 不是 * 日期和时间(datetime,datetimeindex)。即,我希望所有数据点都被折叠到图中相同的24小时范围内。我可以绘制df.xdf.dtm没有问题,但是我刚刚花了两个小时试图弄清楚如何将df.dtm转换为df.time(包含一天中的时间而没有日期),然后绘制它。(对我来说)简单的解决方案不起作用

df.dtm = pd.to_datetime(df.dtm)
    ax.plot(df.dtm,  df.x)
    # Works  (with times on different dates; a range >24h)

    df['time'] = df.dtm.dt.time
    ax.plot(df.time,  df.x)
    # DOES NOT WORK: ConversionError('Failed to convert value(s) to axis '
    matplotlib.units.ConversionError: Failed to convert value(s) to axis units:
    array([datetime.time(0, 0), datetime.time(0, 5), etc.])

字符串
确实有效

pd.plotting.register_matplotlib_converters()  # Needed to plot Pandas df with Matplotlib
    df.dtm = pd.to_datetime(df.dtm, utc=True)     # NOTE: MUST add a timezone, even if undesired
    ax.plot(df.dtm,  df.x)
    # Works as before
    
    df['time'] = df.dtm.dt.time
    ax.plot(df.time,  df.x)
    # WORKS!!! (with time of day, all data in the same 24h range)


请注意,区别在于前两行。第一行允许Pandas和Matplotlib之间更好的协作,第二行似乎是多余的(甚至是错误的),但这对我来说并不重要,因为我使用的是单个时区,并且没有绘制。

相关问题