Построить временные ряды с разными временными метками и форматом datetime.time, продолжительностью более одного дня - PullRequest
1 голос
/ 20 февраля 2020

У меня есть два набора данных, которые содержат показания датчика температуры и освещенности. Измерения проводились с 22:35:41 - 04: 49: 41.

Проблема с этими наборами данных состоит в том, чтобы построить измерения относительно формата datetime.date, когда измерения проводятся от одного дня до другой (22:35:41 - 04:49:41). Функция plot автоматически запускается с 00:00 и помещает данные, которые были измерены до 00:00, в конец графика.

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

Temperature = pd.read_excel("/kaggle/input/Temperature_measurement.xlsx")
Light = pd.read_excel("/kaggle/input/Light_measurement.xlsx")

sns.lineplot(x="Time",y="Light", data = Light)
sns.lineplot(y="Temperature", x="Time", data = Temperature)
plt.show()

plotted data

Это ссылка на набор данных

Вот ссылка на блокнот Jupyter

1 Ответ

2 голосов
/ 20 февраля 2020

Сначала вам нужно преобразовать ваше время в Pandas метку времени. Pandas Временные метки на самом деле не поддерживают время само по себе, они прикрепляют к ним дату, но это нормально, так как мы скрываем эту часть позже.

Нам также необходимо обнаружить изменения дня, которые мы можем сделать это, посмотрев, где находится время, которое можно найти, взглянув на время, которое меньше, чем у его предшественника.

Мы можем подсчитать кумулятивные переходы и добавить это число дат к нашим временным меткам.

Давайте определим функцию, которая будет принимать datetime.time объекты, преобразовывать их в собственные Pandas метки времени (используя произвольную дату 1900-01-01, которая является значением по умолчанию для Pandas) и корректировать день согласно к завершению (поэтому мы заканчиваем с нашим последним временем 1900-01-02):

def normalize_time(series):
    series = pd.to_datetime(series, format="%H:%M:%S")
    series += pd.to_timedelta(series.lt(series.shift()).cumsum(), unit="D")
    return series

Давайте теперь применим его к нашим фреймам данных:

Light["Time"] = normalize_time(Light["Time"])
Temperature["Time"] = normalize_time(Temperature["Time"])

Построение данных сейчас будет выглядеть правильно, время идет непрерывно. За исключением того, что метки тиков X будут пытаться отобразить даты, которые на самом деле не то, что нас интересует, поэтому давайте исправим эту часть сейчас.

Мы можем использовать set_major_formatter Matplotlib вместе с DateFormatter для включения только раз:

import matplotlib.dates

ax = plt.subplot()

sns.lineplot(x="Time", y="Light", data=Light)
sns.lineplot(x="Time", y="Temperature", data=Temperature)

ax.xaxis.set_major_formatter(
    matplotlib.dates.DateFormatter("%H:%M")
)

plt.show()

Это производит X тиков каждый час, что, кажется, идеально подходит для этого набора данных.

Plotted Chart

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...