Построение фрейма данных pandas и оси x в качестве метки времени создает пустой график

#datetime #pandas #matplotlib

#datetime #pandas #matplotlib

Вопрос:

У меня есть pandas.DataFrame (df), который состоит из некоторых значений и даты-времени, которая сначала является строкой, но которую я преобразую в метку времени, используя

 df['datetime'] = pd.to_datetime(df['Time [dd.mm.yyyy hh:mm:ss.ms]'], format="%d.%m.%Y %H:%M:%S.%f")
 

Кажется, это работает, и я могу получить доступ к свойствам элемента нового столбца, таким как obj.day и тому подобное. Таким образом, результирующий столбец содержит временную метку. Когда я пытаюсь построить это с помощью либо pyplot.plot(df['datetime'],df['value_name']) или df.plot(x='datetime',y='value_name') , изображение ниже является повторным. Я попытался преобразовать временные метки с помощью obj.to_pydatetime() , но это ничего не изменило. Сам фрейм данных заполняется некоторыми данными, поступающими из csv. Что меня смущает, так это то, что с определенным csv это работает, а с другими нет. Я почти уверен, что преобразование во временные метки прошло успешно, но я могу ошибаться. Также мое временное окно должно быть с 2015-2016 годов, а не с 1981-1700. Если я попытаюсь найти минимальную и максимальную временную метку из фрейма данных, я получу правильные временные метки в 2015 и 2016 годах соответственно.

Результирующее изображение образует pyplot.plot

Редактировать: df.head() дает:

Время развертки [дд.мм.гггг hh:mm:ss.ms ] Частота [Гц] Напряжение [В]
0 1.0 11.03.2014 10:13:04.270 50.0252 230.529
1 2.0 11.03.2014 10:13:06.254 49.9515 231.842
2 3.0 11.03.2014 10:13:08.254 49.9527 231.754
3 4.0 11.03.2014 10:13:10.254 49.9490 231.678
4 5.0 11.03.2014 10:13:12.254 49.9512 231.719

datetime
0 2014-03-11 10:13:04.270
1 2014-03-11 10:13:06.254
2 2014-03-11 10:13:08.254
3 2014-03-11 10:13:10.254
4 2014-03-11 10:13:12.254

и df.info() дает:

 <class 'pandas.core.frame.DataFrame'>
Int64Index: 33270741 entries, 0 to 9140687
Data columns (total 5 columns):
Sweep                            float64
Time [dd.mm.yyyy hh:mm:ss.ms]    object
Frequency [Hz]                   float64
Voltage [V]                      float64
datetime                         datetime64[ns]
dtypes: datetime64[ns](1), float64(3), object(1)
memory usage: 1.5  GB
 

Я пытаюсь построить график ‘Частота [Гц]’ против ‘дата-время’.

Комментарии:

1. Что такое print (df.head()) и print (df.info) перед построением графика?

Ответ №1:

Я думаю, вам нужно set_index , а затем установить форматирование обеих осей:

 import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

df['datetime'] = pd.to_datetime(df['Time [dd.mm.yyyy hh:mm:ss.ms]'],
                                   format="%d.%m.%Y %H:%M:%S.%f")

print (df)

df.set_index('datetime', inplace=True)

ax = df['Frequency [Hz]'].plot()

ticklabels = df.index.strftime('%Y-%m-%d')
ax.xaxis.set_major_formatter(ticker.FixedFormatter(ticklabels))
ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))
plt.show()