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