无法使用Matplotlib在X轴上显示时间

时间:2018-01-20 12:57:52

标签: python pandas matplotlib

我正在从文件中读取一些数据,然后我必须将这些数据绘制成可视化表示。 文件中的数据采用以下格式:

16:08:45,64,31.2
16:08:46,60,29.3
16:08:47,60,29.3
16:08:48,60,29.3
16:08:49,60,29.3
.
.

此数据存在于包含当前日期的文件中。 该文件包括时间(小时:分钟:秒),Adc计数,温度值

我使用以下代码使用Pandas从文件中读取数据。

from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

year = 2018     # For 2018
'''
month = input ('Enter Month : ')
date = input ('Enter Date : ')
month = int(month)
date = int(date)
'''
# Hardcoded Values for Testing Purpose
month = 1
date = 20

headers = ['Time', 'ADC', 'Temperature']
filename = '%.2d-%.2d-%.2d.txt' % (month, date, year-2000)
print (filename)

try:
    df = pd.read_table( filename, ',', names=headers,\
                        engine='python', header=None)
except:
    print ('No Such File in Database')
    print ('Exiting Program')
    exit()

FMT = '%H:%M:%S'
df['Time'] = df['Time'].map(lambda x: datetime.strptime(str(x), FMT))
df['Time'] = df['Time'].map(lambda x: x.replace(day=date, month=month, year=year))

plt.plot( df['Time'], df['ADC'])

plt.ylim( [0,200])
#plt.gcf().autofmt_xdate()
plt.show()

Graph Generated

我没理解为什么x轴没有正确的值。 是因为原因是样品距离太近(1秒)了吗?

我只想要关于X轴的时间信息。 请建议我如何做到这一点。 提前谢谢。

更新

通过评论,我能够找到原因,为什么会发生这种情况。 Pandas将我的日期和时间视为timestamp个对象,而使用Matplotlib绘制它时,它应该是datetime个对象。 如果我能够将df['Time']Timestamp转换为datetime,我的问题就会得到解决。 我在网上搜索并发现pd.to_datetime,会为我做这项工作,但不幸的是,它不起作用。 以下命令将列出我所做的事情。

>>> x = pd.Timestamp( "2018-01-20")
>>> x
Timestamp('2018-01-20 00:00:00')
>>> pd.to_datetime( x, format="%Y-%m-%d")
Timestamp('2018-01-20 00:00:00')

如上所示,我仍然得到timestamp个对象 我再次搜索以检查它为什么不起作用,然后我发现以下行将起作用。

>>> x = pd.Timestamp( "2018-01-20")
>>> y = pd.to_datetime( x, format="%Y-%m-%d")
>>> y.to_datetime()

Warning (from warnings module):
  File "D:\Program Files\Python36\lib\idlelib\run.py", line 457
    exec(code, self.locals)
FutureWarning: to_datetime is deprecated. Use self.to_pydatetime()
datetime.datetime(2018, 1, 20, 0, 0)
>>> 

要删除此警告,可以使用以下命令。

>>> x = pd.Timestamp( "2018-01-20")
>>> y = pd.to_datetime( x, format="%Y-%m-%d")
>>> y.to_pydatetime()
datetime.datetime(2018, 1, 20, 0, 0)

现在我在我的项目中测试了这些命令,看看这是否适用于我的数据框,我只是拿了一个值进行测试。

>>> x = df['Time'][0].to_pydatetime()
>>> x
datetime.datetime(2018, 1, 20, 16, 8, 45)

所以,是的,它正在工作,现在我必须在完整的数据帧列上应用它,我使用了以下命令。

>>> df['New'] = df['Time'].apply(lambda x: x.to_pydatetime())
>>> df['New'][0]
Timestamp('2018-01-20 16:08:45')

但它仍然是一样的。 我是新手,所以我无法理解我做错了什么。

1 个答案:

答案 0 :(得分:2)

首先,我们需要一个最小的,可验证的例子:

u = u"""16:08:45,64,31.2
16:08:46,54,29.3
16:08:47,36,34.3
16:08:48,67,36.3
16:08:49,87,29.3"""

import io
from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

year = 2018
month = 1
date = 20

headers = ['Time', 'ADC', 'Temperature']

df = pd.read_table(io.StringIO(u), ',', names=headers,\
                        engine='python', header=None)

FMT = '%H:%M:%S'
df['Time'] = df['Time'].map(lambda x: datetime.strptime(str(x), FMT))
df['Time'] = df['Time'].map(lambda x: x.replace(day=date, month=month, year=year))

plt.plot( df['Time'], df['ADC'])

plt.ylim( [20,100])
plt.gcf().autofmt_xdate()
plt.show()

使用pandas 0.20.1和matplotlib 2.1运行此代码,生成以下图表,看起来符合要求:

enter image description here

这种方法有效,即使日期是熊猫时间戳,matplotlib也会在内部使用pandas转换器(如果它们可用)。 如果没有,可以先尝试手动加载它们,

import pandas.plotting._converter as pandacnv
pandacnv.register()

如果这也失败了,可能确实会尝试将时间戳转换为datetime对象。

dt = [x.to_pydatetime() for x in df['Time']]
plt.plot( dt, df['ADC'])