Как построить график с x_lims между временем h1: m1 и h2: m2 - PullRequest
0 голосов
/ 21 мая 2018

Я работаю над проектом с большим количеством данных о температуре, и сейчас я обрабатываю и строю все свои данные.Тем не менее, я продолжаю падать, когда пытаюсь установить x_lims на своих графиках между временем 1 (9:00) и временем 2 (21:00)

Фон данных:

Датчик собирал данные каждую секунду в течение двух недель, и я разбил основной файл данных на более мелкие ежедневные файлы (например, dayX).Каждый день содержит метку времени (column = 'timeStamp') и среднюю температуру (column = 'meanT').

Данные для каждого дня были предварительно слегка наложены на окно, которое я хочу построить (т.е. dayXсодержит данные с 8:55:00 до 21:05:00).Набор данных содержит значения NaN в некоторых точках, поскольку датчики не были изношены, и данные необходимо было отбросить.

Цель:

Я хочу иметь возможностьпостроить данные дня X между заданным интервалом времени (x_lim = 9:00 - 21:00).Поскольку у меня есть данные за много дней, я в конечном итоге хочу построить каждый день, используя одну и ту же ось х (я хочу, чтобы они были отдельными фигурами, а не вспомогательными участками), но каждый день имеет разные пропуски в основном наборе данных, поэтому я хочу установитьконстанта х лим.Поскольку у меня много разных дней данных, я бы предпочел не указывать дату и время.

Пример данных:

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 голосов
/ 21 мая 2018

Ваш timeStamp является datetime объектом.Все, что вам нужно сделать, это передать объекты 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()

Выход:

enter image description here

0 голосов
/ 21 мая 2018

Вам, вероятно, нужно создать объект с полной отметкой времени, так как он по умолчанию будет соответствовать сегодняшней дате, которая в вашем случае не содержит данных.следующий фрагмент должен заменить строку 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...