Группировка по частоте, затем построение групп
Сначала Считайте данные CSV в кадр данных Pandas
import numpy as np
import Pandas as pd
from matplotlib import pyplot as plt
# assumes NO header line in csv
df = pd.read_csv('\file\path', names=['time','temp'], parse_dates=[0])
Я буду использовать некоторые фальшивые данные, 30-дневные почасовые выборки.
heat = np.random.random(24*30) * 100
dates = pd.date_range('1/1/2011', periods=24*30, freq='H')
df = pd.DataFrame({'time':dates,'temp':heat})
Установить метки времени в качестве индекса DataFrame
df = df.set_index('time')
Теперь сгруппируйте по нужному периоду, семь дней для этого примера
gb = df.groupby(pd.Grouper(freq='7D'))
Теперь вы можете строить каждую группу отдельно
for g, week in gb2:
#week.plot()
week.boxplot()
plt.title(f'Week Of {g.date()}')
plt.show()
plt.close()
И ... я не знал, что ты мог бы сделать это, но это круто
ax = gb.boxplot(subplots=False)
plt.setp(ax.xaxis.get_ticklabels(),rotation=30)
plt.show()
plt.close()
![Weekly Temps](https://i.stack.imgur.com/yi84P.png)
heat = np.random.random(24*300) * 100
dates = pd.date_range('1/1/2011', periods=24*300, freq='H')
df = pd.DataFrame({'time':dates,'temp':heat})
df = df.set_index('time')
Чтобы разделить данные на пять периодов времени, получите еженедельные блокпосты каждого:
Определите общий промежуток времени; разделить на пять; создать частотный псевдоним; затем групповой
dt = df.index[-1] - df.index[0]
dt = dt/5
alias = f'{dt.total_seconds()}S'
gb = df.groupby(pd.Grouper(freq=alias))
Каждая группа - это DataFrame, поэтому итерируйте по группам; создайте еженедельно групп из каждой и составьте для них график.
for g,d_frame in gb:
gb_tmp = d_frame.groupby(pd.Grouper(freq='7D'))
ax = gb_tmp.boxplot(subplots=False)
plt.setp(ax.xaxis.get_ticklabels(),rotation=90)
plt.show()
plt.close()
Возможно, есть лучший способ сделать это, в таком случае я опубликую его, или, может быть, кто-то предоставит бесплатную правку для редактирования. Похоже, это может привести к тому, что у последней группы не будет полного набора данных. ...
Если вы знаете, что ваши данные являются периодическими, вы можете просто разделить их на фрагменты.
n = len(df) // 5
for tmp_df in (df[i:i+n] for i in range(0, len(df), n)):
gb_tmp = tmp_df.groupby(pd.Grouper(freq='7D'))
ax = gb_tmp.boxplot(subplots=False)
plt.setp(ax.xaxis.get_ticklabels(),rotation=90)
plt.show()
plt.close()
Псевдонимы частот
pandas.read_csv ()
pandas.Grouper ()