Как установить временной диапазон по оси X и диапазон дат по оси Y с помощью карты цветов - PullRequest
0 голосов
/ 12 марта 2019

Я создал код, который показывает тепловую карту данных в файле CSV. Код выглядит следующим образом:

import pandas as pd
import matplotlib.pyplot as plt
data= pd.read_csv("data.csv" , sep=';', header=0, 
index_col='Date')
fig=plt.imshow(data, cmap='YlOrBr', interpolation='nearest')
plt.colorbar()
plt.xlabel("Time (UTC)")
plt.ylabel("Date")
plt.show()

enter image description here

Набор данных выглядит следующим образом:

enter image description here

Диапазон времени варьируется от 00:00 до 23:50 с шагом 10 минут. Я хочу, чтобы ось х показывала время с 00:00 до 23:50 с шагом в час.

Индекс установлен как дата. Диапазон дат: с 29 октября 2017 года по 24 марта 2018 года. Я хочу, чтобы ось Y показывала диапазон дат в шагах месяцев.

1 Ответ

0 голосов
/ 12 марта 2019

Вы можете stack столбцы, затем groupby месяц и час и затем unstack его обратно (я собираю mean значения здесь при агрегации, но вы можете изменить на sum или любое другое значение агрегации должно быть сделано там):

df = pd.DataFrame(np.nan,
                  columns=pd.date_range('00:00', '23:50', freq='10min'),
                  index=pd.date_range('2017-10-29', '2018-03-24'))
df[df.columns] = np.random.randint(0, 100, df.shape)

fig, ax = plt.subplots(2, figsize=(10,6))
ax[0].imshow(df, cmap='YlOrBr')

ix = df.stack().index
l1 = ix.get_level_values(0).month
l2 = ix.get_level_values(1).hour

df2 = df.stack().groupby([l1,l2], sort=False).mean().unstack(1)

ax[1].imshow(df2, cmap='YlOrBr')

Вывод (оригинальный DataFrame выше, обработан ниже):

output

Обновление:

Если цель состоит в том, чтобы просто поставить ежемесячные и почасовые метки на одном графике, см. Ниже:

df = pd.DataFrame(np.nan,
                  columns=pd.date_range('00:00', '23:50', freq='10min').astype(str),
                  index=pd.date_range('2017-10-29', '2018-03-24').astype(str))

df[df.columns] = np.random.randn(*(df.shape))

fig, ax = plt.subplots(1, figsize=(10,6))

l1 = pd.to_datetime(df.index).month
l2 = pd.to_datetime(df.columns).hour
x = pd.Series(l2).drop_duplicates()
y = pd.Series(l1).drop_duplicates()

ax.imshow(df, cmap='YlOrBr')

ax.set_xticks(x.index)
ax.set_xticklabels(x)

ax.set_yticks(y.index)
ax.set_yticklabels(y)

Выход:

output(2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...