【问题标题】:Plotting in matplotlib using pandas使用 pandas 在 matplotlib 中绘图
【发布时间】:2018-06-03 10:37:18
【问题描述】:

我正在尝试使用 2 个 y 轴和一个共享的 x 轴进行绘图。我已经到了这一点,但它不是我想要的 x 轴。

这是我的代码:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel("Live_data_test.xlsx","Sheet1")



timedat = df.loc[:, 'Time']
temperaturedat = df.loc[:, 'Temperature']
humiditydat = df.loc[:, 'Humidity']

fig, ax1 = plt.subplots()

ax2 = ax1.twinx()
ax1.plot(timedat, temperaturedat, 'g-')
ax2.plot(timedat, humiditydat, 'b-')

ax1.set_xlabel('Time')
ax1.set_ylabel('Temperature', color='g')
ax2.set_ylabel('Humidity', color='b')

plt.show()

无论我有多少点,x 轴都绘制为 0,1,2,...。它没有绘制定义的 x 轴,它应该是我在电子表格中设置的 unix 时间。

电子表格:

Time    Temperature Humidity
1513753200  54  45
1513753201  55  48
1513753202  55  50
1513753203  56  52
1513753204  56  54
1513753205  57  54
1513753206  56  54
1513753207  56  55
1513753208  56  56
1513753209  55  56
1513753210  54  52
1513753211  53  50
1513753212  52  45
1513753213  51  45

当我做 print(timedat) 我得到这个:

0     1.513753e+09
1     1.513753e+09
2     1.513753e+09
3     1.513753e+09
4     1.513753e+09
5     1.513753e+09
6     1.513753e+09
7     1.513753e+09
8     1.513753e+09
9     1.513753e+09
10    1.513753e+09
11    1.513753e+09
12    1.513753e+09
13    1.513753e+09
Name: Time, dtype: float64

我相信将 unix 时间转换为 H:M:S M/D/Y 时间应该足够简单。我一直在寻找几个小时试图将 x 轴绘制为定义的时间,但无济于事。

【问题讨论】:

  • df.Time = df.Time.astype(int) 怎么样?
  • 我添加了我的图表图片
  • 尝试将其转换为字符串,然后进行绘图。 df.Time = df.Time.astype(str)
  • 我认为这可能成功了!我只需要将 unix 时间转换为日期时间并调整刻度线标签的角度就可以了!谢谢!

标签: python pandas numpy matplotlib plot


【解决方案1】:

将您的纪元时间戳转换为日期时间并使用 pandas 内置的轴标签格式。尝试替换这个:

timedat = df.loc[:, 'Time']

用这个:

timedat = pd.to_datetime(df['Time'], unit='s')

【讨论】:

    【解决方案2】:

    要将 Time 列从 unix 格式转换为字符串日期时间,请使用 pd.to_datetime + dt.strftime -

    df.Time = pd.to_datetime(df.Time, unit='s').dt.strftime('%H:%I:%S %m/%d/%y')
    df
    
                     Time  Temperature  Humidity
    0   07:07:00 12/20/17           54        45
    1   07:07:01 12/20/17           55        48
    2   07:07:02 12/20/17           55        50
    3   07:07:03 12/20/17           56        52
    4   07:07:04 12/20/17           56        54
    5   07:07:05 12/20/17           57        54
    6   07:07:06 12/20/17           56        54
    7   07:07:07 12/20/17           56        55
    8   07:07:08 12/20/17           56        56
    9   07:07:09 12/20/17           55        56
    10  07:07:10 12/20/17           54        52
    11  07:07:11 12/20/17           53        50
    12  07:07:12 12/20/17           52        45
    13  07:07:13 12/20/17           51        45
    

    【讨论】:

    • 我尝试了这段代码,它的工作方式正是我希望它在 Windows 10 上运行 Python 3.6 的方式,但现在我正在转移到我的树莓派 3(希望在触摸屏上使用它)最终)并且我得到一个错误:“系列”对象没有属性“dt”。如果我在该代码行中删除“.dt”之后的所有内容,则它的图形不正确(它最初在图片中是如何做的)。但是当我打印 timedat 时,它以以下格式打印:“YYYY-MM-DD H:MM:SS.ms” 错误可能是因为我在 python 3.4.2 上运行代码,这是 Pi' 的默认值吗?跨度>
    • @smashed_ 你还在运行相同的代码吗? pd.to_datetime(df.Time, unit='s') 的输出是什么?
    • @COLDSPEED 我正在运行相同的代码。我已经在 pi 上安装了最新版本的 pandas。该代码仅与 df.Time = pd.to_datetime(df.Time, unit='s').dt.strftime('%H:%I:%S %m/%d/%y') 中断 pd.to_datetime(df.Time, unit='s') 的输出为: 0 2017-12-20 07:00:00 1 2017-12-20 07:00:01 2 2017-12-20 07:00:02.005000 。 ..但它不会在图表上绘制。它的图形如 OP 中所示。
    • @smashed_ 嗯,非常令人费解。如果您说代码可以在您的桌面上运行,但不能在 rpi 上运行,那么您可以使用 raspberry-pi 标签打开一个新问题并解释您的问题?
    • 我对环境不熟悉,所以我想不出什么可以解释这一点。
    猜你喜欢
    • 2017-12-12
    • 2020-10-25
    • 2015-01-09
    • 2014-02-01
    • 2018-02-24
    • 2018-06-27
    • 2014-07-27
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多