Сначала вам нужно преобразовать ваше время в 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 тиков каждый час, что, кажется, идеально подходит для этого набора данных.