Как построить время только для атрибута pandas datetime64 [ns]

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

Время равно 00:00 в любой момент

пытался преобразовать временные метки до 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()
  

Теперь видно время