Как построить график для каждой даты в Python - PullRequest
0 голосов
/ 16 марта 2020

У меня есть набор дат df, как показано ниже:

    id         timestamp        data     group_id
99  265 2019-11-28 15:44:34.027  22.5         1
100 266 2019-11-28 15:44:34.027  23.5         2
101 267 2019-11-28 15:44:34.027  27.5         3
102 273 2019-11-28 15:44:38.653  22.5         1
104 275 2019-11-28 15:44:38.653  22.5         2

Я хочу построить график для данных на ту же дату. Таким образом, я создал новый столбец Date на основе timestamp. Код выглядит следующим образом:


import datetime
from pandas.tseries.offsets import DateOffset

df = df[df['temperature']>0]
df['timestamp'] = pd.to_datetime(df['timestamp'])

start_date = pd.to_datetime('2020-02-01 00:00:00')
end_date = pd.to_datetime('2020-02-05 00:00:00')
df = df.loc[(df['timestamp'] > start_date) & (df['timestamp'] < end_date)]

df['Date'] = [datetime.datetime.date(d) for d in df['timestamp']] 
df['Date'] = pd.to_datetime(df['Date'])


GROUP_ID = 2
df = df[df['group_id'] == GROUP_ID]

for date in df['Date'].unique():  
  df['Date'] = pd.to_datetime(df['Date'])
  df = df[df['Date'] == date]   # Edited Question: added this line and received error `TypeError: no numeric data to plot`.
  df.plot(x='timestamp', y='data', figsize=(30, 16)) 
  plt.axhline(y=40, color='r', linestyle='-')
  plt.axhline(y=25, color='b', linestyle='-')

  df['top_lim'] = 40
  df['bottom_lim'] = 25

  plt.fill_between(df['timestamp'], df['bottom_lim'], df['data'],
                where=(df['data'] >= df['bottom_lim'])&(df['data'] <= df['top_lim']),
                facecolor='orange', alpha=0.3)

  mask = (df['data'] <= df['top_lim'])&(df['data'] >= df['bottom_lim'])
  plt.scatter(df['timestamp'][mask], df['data'][mask], marker='.', color='black')

  cumulated_time = df['timestamp'][mask].diff().sum()

  plt.gcf().subplots_adjust(left = 0.3)
  plt.xlabel('Timestamp')
  plt.ylabel('data')
  plt.show()

В результате я получил 3 графика, выглядящих одинаково, и нанес на график все данные всего временного интервала между 2020-02-01 и 2020-02-05 вместо того, чтобы ежедневные данные наносились на каждый график.

Что не так с моим кодом?


Отредактированный вопрос:

Добавлена ​​строка df = df[df['Date'] == date] и получена ошибка ниже:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-54-58d9f4ed160f> in <module>()

     34   df = df[df['Date'] == date]
---> 35   df.plot(x='timestamp', y='data', figsize=(30, 16))
     36   plt.axhline(y=40, color='r', linestyle='-')
     37   plt.axhline(y=25, color='b', linestyle='-')

3 frames
/usr/local/lib/python3.6/dist-packages/pandas/plotting/_matplotlib/core.py in _compute_plot_data(self)
    412         # no non-numeric frames or series allowed
    413         if is_empty:
--> 414             raise TypeError("no numeric data to plot")
    415 
    416         # GH25587: cast ExtensionArray of pandas (IntegerArray, etc.) to

TypeError: no numeric data to plot

Я думаю, это потому, что нет данных о 2020-02-02. Итак, новый вопрос: как я могу пропустить итерацию, когда нет данных для конкретной даты?

1 Ответ

0 голосов
/ 17 марта 2020

Вы не фильтруете данные по дате внутри для l oop. Это нормально, если вы получаете один и тот же сюжет 3 раза. Вы должны отфильтровать ваши данные внутри для l oop и создать новый фрейм данных для каждой даты, а затем построить этот фрейм данных. Вы можете попробовать что-то вроде df_date = df.loc [df ['Date'] == Date]. Затем построите график, используя df_date.

...