我正在开发一个包含大量温度数据的项目,我正在处理和绘制我的所有数据。但是,当我尝试在时间1(9:00)和时间2(21:00)之间在我的地块上设置x_lims时,我一直在犯规。
数据背景:
传感器每两周收集一次数据两周,我将主数据文件拆分为较小的每日文件(例如dayX)。每天都包含一个时间戳(column ='timeStamp')和一个平均温度(column ='meanT')。
我想要绘制的窗口(即dayX包含8:55:00 - 21:05:00之间的数据)的每一天的数据都被略微设定。由于传感器未磨损且需要丢弃数据,因此数据集在某些点包含NaN值。
目标:
我想要做的是能够在设定的时间间隔(x_lim = 9:00 - 21:00)之间绘制dayX数据。由于我有很多天的数据,我最终想要使用相同的x轴绘制每一天(我希望它们作为单独的图形而不是子图),但每天在主数据集中有不同的间隙,所以我想设置常数x lims。由于我有许多不同的数据日,所以我不必指定日期和时间。
示例数据:
dayX =
timeStamp meanT
2018-05-10 08:55:00 NaN
. .
. .
. .
2018-05-10 18:20:00 32.4
. .
. .
. .
2018-05-10 21:05:00 32.0
我尝试了什么:
import pandas as pd
import numpy as np
import datetime as dt
import matplotlib.pyplot as plt
from matplotlib.dates import date2num, DateFormatter
dayX = pd.read_csv('path/to/file/dayX.csv)
dayX['timeStamp'] = pd.to_datetime(dayX['timeStamp'], format=%Y %m %d %H:%M:%S.%f')
fig, ax1 = plt.subplots(1,1)
ax1.plot(dayX['timeStamp'], dayX['meanT'])
ax1.xaxis.set_major_formatter(DateFormatter('%H:%M'))
ax1.set_xlim(pd.Timestamp('9:00'), pd.Timestamp('21:00'))
fig.autofmt_xdate()
plt.show()
给出了:
但是,如果我删除限制线,则数据绘制正常,但会自动选择限制
# Get rid of this line:
ax1.set_xlim(pd.Timestamp('9:00'), pd.Timestamp('21:00'))
# Get this:
我真的不确定为什么会出错或者我应该尝试什么。
答案 0 :(得分:1)
您的timeStamp
是datetime
个对象。您所要做的就是将日期时间对象作为限制传递。
import pandas as pd
import numpy as np
import datetime as dt
import matplotlib.pyplot as plt
from matplotlib.dates import date2num, DateFormatter
dayX = df
dayX['timeStamp'] = pd.to_datetime(dayX['timeStamp'], format='%Y-%m-%d %H:%M:%S')
fig, ax1 = plt.subplots(1,1)
ax1.plot(dayX['timeStamp'], dayX['meanT'])
ax1.xaxis.set_major_formatter(DateFormatter('%H:%M'))
ax1.set_xlim(df['timeStamp'].min().replace(hour=9), df['timeStamp'].min().replace(hour=21))
fig.autofmt_xdate()
plt.show()
输出:
答案 1 :(得分:0)
您可能需要构建一个完整的时间戳对象,因为它默认为今天的日期,在您的情况下没有数据。以下代码段shoudl会替换代码中的ax1.set_xlim
行,并且还可以用于在您选择的特定时间内开始和结束多日时间范围。
min_h = 9 # hours
max_h = 21 # hours
start = dayX['timeStamp'].min()
end = dayX['timeStamp'].max()
xmin = pd.Timestamp(year=start.year, month=start.month, day=start.day, hour=min_h)
xmax = pd.Timestamp(year=end.year, month=end.month, day=end.day, hour=max_h)
ax1.set_xlim(xmin, xmax)