У меня есть набор дат 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
. Итак, новый вопрос: как я могу пропустить итерацию, когда нет данных для конкретной даты?