【问题标题】:numpy and pandas datetime handling in matplotlibmatplotlib 中的 numpy 和 pandas 日期时间处理
【发布时间】:2020-01-05 23:48:16
【问题描述】:

我正在尝试将曲线拟合为时间序列,如下所述:https://stackoverflow.com/a/17639070/12012445

如果我导入 pandas 模块 - 一切都像魅力一样。 如果我这样做了,而且我必须这样做, - 我得到“'datetime.timezone' 对象没有属性 '_utcoffset'”

在我看来,问题在于绘图步骤是否返回多项式 p(x) 的系数,而多项式 p(x) 又取决于日期时间...

我经历了很多提示,包括Converting between datetime, Timestamp and datetime64

我很绝望(第 5 小时研究)

import pandas as pd #note that I'm not even calling it anywhere... so confused

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime as dt
import time


dates = [dt.datetime(1978, 7, 7),
     dt.datetime(1980, 9, 26),
     dt.datetime(1983, 8, 1),
     dt.datetime(1985, 8, 8)]

y = [0.00134328779552718,
     0.00155187668863844,
     0.0039431374327427,
     0.00780037563783297]


yerr = [0.0000137547160254577,
        0.0000225670232594083,
        0.000105623642510075,
        0.00011343121508]

x = mdates.date2num(dates)

z4 = np.polyfit(x, y, 3)
p4 = np.poly1d(z4)

fig, cx = plt.subplots()

xx = np.linspace(x.min(), x.max(), 100)
dd = mdates.num2date(xx)

cx.plot(dd, p4(xx), '-g')
cx.plot(dates, y, '+', color='b', label='blub')
cx.errorbar(dates, y,
             yerr,
             marker='.',
             color='k',
             ecolor='b',
             markerfacecolor='b',
             label="series 1",
             capsize=0,
             linestyle='')

cx.grid()
cx.set_ylim(0, 0.03)
plt.show()

期待:

【问题讨论】:

  • 能分享一下你用的pandas和matplotlib的版本吗?
  • 我不明白你的问题。代码在没有 pandas 库的情况下也能正常工作。
  • @Madhuri Sangaraju 熊猫 0.24.2,numpy 1.15.4,matplotlib 3.0.3
  • @Hue,没错-代码在没有熊猫的情况下可以正常工作,但我必须在其他领域有熊猫..我要尝试link下面的答案,会让你知道
  • Answer 下面工作了!谢谢!

标签: python pandas numpy datetime matplotlib


【解决方案1】:

上面的答案有效。另一方面,如果您想继续使用 pandas 转换器。但是mdates 的格式不同。它从 0 年开始计算天数。因此,可以尝试通过以下方式将mdates 格式转换为标准datetime 格式:

dd = mdates.num2date(xx)
t0 = mdates.date2num(pd.to_datetime(0)) # obtain 1970-01-01 in mdates
new_dates = pd.to_datetime(((dd-t0)*24*3600).astype(int), unit='s')
# explicitly register pandas converter to avoid a future warning
pd.plotting.register_matplotlib_converters()

请注意,pandas 版本 0.25.1 似乎已经解决了该问题

【讨论】:

    【解决方案2】:

    如果您导入 pandas,它将注册其日期时间转换器以供 matplotlib 使用。显然那些地方有问题。如果发生这种情况,您可以通过

    import pandas as pd
    pd.plotting.deregister_matplotlib_converters()
    

    这将确保使用 matplotlib 转换器并且这些转换器似乎按预期工作。

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 2021-06-15
      • 1970-01-01
      • 2018-03-13
      • 2019-05-14
      • 1970-01-01
      • 2014-03-24
      • 2018-04-13
      • 2019-04-28
      相关资源
      最近更新 更多