【问题标题】:How to plot CSV data using matplotlib and pandas in python如何在 python 中使用 matplotlib 和 pandas 绘制 CSV 数据
【发布时间】:2017-07-11 09:19:15
【问题描述】:

我有一个 python 代码,其中我使用 pandas 读取了一个 csv 文件,并将日期和时间存储在 Datetime 列中。现在我想在 y 轴上绘制传感器值,在 x 轴上绘制数据时间。我怎样才能做到这一点?我的代码如下:

import pandas as pd
import datetime
import csv
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
headers = ['Sensor Value','Date','Time']
df = pd.read_csv('C:/Users\Lala Rushan\Downloads\DataLog.CSV',parse_dates=     {"Datetime" : [1,2]},names=headers)
print (df)

这是数据集中的一些行:

                      Datetime  Sensor Value
0     2017/02/17  19:06:17.188             2
1     2017/02/17  19:06:22.360            72
2     2017/02/17  19:06:27.348            72
3     2017/02/17  19:06:32.482            72
4     2017/02/17  19:06:37.515            74
5     2017/02/17  19:06:42.580            70
6     2017/02/17  19:06:47.660            72

【问题讨论】:

    标签: python csv pandas matplotlib


    【解决方案1】:

    为了让这段代码在我当前使用 Python 2.7.16 编码的机器(MacOS 10.14)上工作,我需要声明标题所在的 CSV 文件的行。所以这是 read_csv 部分中的 header=1,正如官方 pandas read_csv 页面 here 所推荐的那样。

    我的代码如下:

    import pandas as pd
    from datetime import datetime
    import csv
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    headers = ['sensor_data','Date']
    df = pd.read_csv('output.csv',header=1,names=headers)
    
    df['Date']= pd.to_datetime(df['Date'], format='%Y-%m-%d %H:%M:%S')
    
    df['Date']= df['Date'].map(lambda x: datetime.strptime(str(x), '%Y-%m-%d %H:%M:%S'))
    
    x = df['Date']
    print(x)
    y = df['sensor_data']
    
    # plot
    plt.plot(x,y)
    # beautify the x-labels
    plt.gcf().autofmt_xdate()
    
    plt.show()

    【讨论】:

    【解决方案2】:

    更新了 Python 3.9 的解决方案,日期格式为“2022-01-11 23:57”:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_csv('data.csv')
    
    df['DATE'] = pd.to_datetime(df['DATE'], format='%m/%d/%Y %H:%M')
    
    x = df['DATE']
    y = df['Sensor Value']
    
    plt.plot(x,y)
    # beautify the x-labels
    plt.gcf().autofmt_xdate()
    
    plt.show()
    

    【讨论】:

      【解决方案3】:

      确保您的日期列是日期时间格式并在 matplotlib 中使用 plot() 函数。您可以执行类似于this 的操作。这里 x 值将是您的日期列,y 值将是传感器值。

      import pandas as pd
      from datetime import datetime
      import csv
      import matplotlib.pyplot as plt
      import matplotlib.dates as mdates
      headers = ['Sensor Value','Date','Time']
      df = pd.read_csv('C:/Users\Lala Rushan\Downloads\DataLog.CSV',names=headers)
      print (df)
      
      df['Date'] = df['Date'].map(lambda x: datetime.strptime(str(x), '%Y/%m/%d %H:%M:%S.%f'))
      x = df['Date']
      y = df['Sensor Value']
      
      # plot
      plt.plot(x,y)
      # beautify the x-labels
      plt.gcf().autofmt_xdate()
      
      plt.show()
      

      【讨论】:

      • 当我运行程序时,它会给出 ValueError: could not convert string to float: ' 2017/02/17 19:49:27.550'。我该如何解决这个问题?
      • 您的日期列不是日期时间格式。您可以在为 x 赋值之前使用 - df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d %H:%M:%S.%f)'
      • 感谢您的评论。现在它给了我错误:ValueError: time data '2017/02/17 19:06:17.188' doesn't match format specified。这里可能是什么问题?格式与从 csv 获取的格式相同。
      • 您能在问题中发布几行数据集吗?有人可以快速回答问题。
      • 我已经编辑了答案。日期列中日期和时间之间的空格数似乎存在问题。根据您的要求更改 lambda 表达式。我还添加了一种导入日期时间包的方法。
      猜你喜欢
      • 2021-02-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2020-06-20
      相关资源
      最近更新 更多