如何在时间h1:m1和h2:m2

时间:2018-05-21 16:23:14

标签: python python-3.x datetime matplotlib

我正在开发一个包含大量温度数据的项目,我正在处理和绘制我的所有数据。但是,当我尝试在时间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()

给出了:

empty figure

但是,如果我删除限制线,则数据绘制正常,但会自动选择限制

    # Get rid of this line:
    ax1.set_xlim(pd.Timestamp('9:00'), pd.Timestamp('21:00'))
    # Get this:

full figure, wrong boundaries

我真的不确定为什么会出错或者我应该尝试什么。

2 个答案:

答案 0 :(得分:1)

您的timeStampdatetime个对象。您所要做的就是将日期时间对象作为限制传递。

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()

输出:

enter image description here

答案 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)