我正在从文件中读取一些数据,然后我必须将这些数据绘制成可视化表示。 文件中的数据采用以下格式:
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()
我没理解为什么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')
但它仍然是一样的。 我是新手,所以我无法理解我做错了什么。
答案 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运行此代码,生成以下图表,看起来符合要求:
这种方法有效,即使日期是熊猫时间戳,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'])