#python #pandas #datetime #plot
#python #pandas #дата и время #график
Вопрос:
У меня есть фрейм данных с большим временным диапазоном в формате datetime64[ns]
и значением int
Данные выглядят так:
MIN_DEP DELAY
0 2018-01-01 05:09:00 0
1 2018-01-01 05:13:00 0
2 2018-01-01 05:39:00 0
3 2018-01-01 05:43:00 0
4 2018-01-01 06:12:00 34
... ... ...
77005 2020-09-30 23:42:00 0
77006 2020-09-30 23:43:00 0
77007 2020-09-30 23:43:00 43
77008 2020-10-01 00:18:00 0
77009 2020-10-01 00:59:00 0
[77010 rows x 2 columns]
MIN_DEP datetime64[ns]
DELAY int64
dtype: object
Цель состоит в том, чтобы отобразить все данные только в диапазоне от 00: 00 до 24:00 по оси x, больше никаких дат.
Когда я пытаюсь его построить, временная шкала равна 00:00 в любой момент. Как это исправить?
import matplotlib.dates as mdates
fig, ax = plt.subplots()
ax.plot(pd_to_stat['MIN_DEP'],pd_to_stat['DELAY'])
xfmt = mdates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(xfmt)
plt.show()
пытался преобразовать временные метки до dt.time и затем отобразить их
pd_to_stat['time'] = pd.to_datetime(pd_to_stat['MIN_DEP'], format='%H:%M').dt.time
fig, ax = plt.subplots()
ax.plot(pd_to_stat['time'],pd_to_stat['DELAY'])
plt.show()
График не позволяет этого делать:
TypeError: float() argument must be a string or a number, not 'datetime.time'
Ответ №1:
В соответствии с вашими требованиями, я думаю, вам не нужны даты, а также поле секунд в вашей временной метке. Итак, сначала вам нужно немного предварительной обработки. Удалите поле секунд, используя приведенный ниже код
dataset['MIN_DEP'] = dataset['MIN_DEP'].strftime("%H:%M")
Затем вы можете удалить дату из своей временной метки следующим образом
dataset['MIN_DEP'] = pd.Series([val.time() for val in dataset['MIN_DEP']])
Затем вы можете отображать свои данные обычным способом.
Комментарии:
1. Спасибо! Но сюжет все еще говорит
TypeError: float() argument must be a string or a number, not 'datetime.time'
2. Не могли бы вы напечатать тип dataset[‘MIN_DEP’] после использования моего решения и указать, какой тип данных после этого.
3.
MIN_DEP object
На самом деле ваше решение делает то же самоеpd_to_stat['time'] = pd.to_datetime(pd_to_stat['MIN_DEP'], format='%H:%M').dt.time
, что я указал в конце моего поста.
Ответ №2:
Похоже, сейчас это работает. Я не узнал, график все еще разделялся по датам. Чтобы обойти это, я хочу заменить все даты на одну и ту же дату и отобразить ее, скрыв дату с помощью DateFormatter
import matplotlib.dates as mdates
pd_to_stat['MIN_DEP'] = pd_to_stat['MIN_DEP'].map(lambda t: t.replace(year=2020, month=1, day=1))
fig, ax = plt.subplots()
ax.plot(pd_to_stat['MIN_DEP'],pd_to_stat['DELAY'])
xfmt = mdates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(xfmt)
plt.show()