У меня есть фрейм данных с количеством сообщений и периодом времени, в который они были отправлены (с шагом 10 минут). Вот фрагмент:
+---------------------+--------------+
| UnixTime | Num messages |
+---------------------+--------------+
| 2019-02-01 00:00:00 | 54 |
| 2019-02-01 00:10:00 | 23 |
| 2019-02-01 00:20:00 | 36 |
+---------------------+--------------+
Этот фрейм данных имеет метки времени приращения за год и количество сообщений за этот период. Как я могу смоделировать среднюю/медианную неделю, используя весь фрейм данных и день недели в качестве эталона.
+-----------------+-------------------------+
| UnixTime (Mean) | Mean number of messages |
+-----------------+-------------------------+
| Friday 00:00:00 | 56.3 |
| Friday 00:10:00 | 25.5 |
| Friday 00:20:00 | 30.4 |
+-----------------+-------------------------+
Таким образом, выходной фрейм данных должен моделировать среднюю неделю с понедельника по воскресенье в течение года с количеством сообщений, усредненным за год для этого периода времени и дня.
Я знаю, что могу получить день недели по df["Day Of Week"] = df['UnixTime'].dt.day_name()
, но как я могу смоделировать среднее значение, чтобы каждый понедельник года между 09:00 - 09:10
рассматривался, например, как одна и та же группа.
Не уверен, правильно ли я вас понял, но если вы хотите получить среднее значение для каждого дня недели. Разве столбец Mean number of messages
в вашем фрейме данных не должен иметь одинаковое значение?
@Erfan Так что это будет среднее количество сообщений, отправленных с 00:00 до 00:10 в пятницу и так далее.
То есть каждая пятница года между 00:00 - 00:10
считается одной и той же группой?
@Erfan Вот именно, да
У нас может быть новый столбец «weekNum», чтобы пометить каждую строку как часть N-й недели года. Мы можем сделать это делением пола на числовые значения дней.
df["weekNum"] = int(df["UnixTime"].dt.day//7)
Затем мы можем сгруппировать:
df.groupby("weekNum").mean()
df.groupby("Day of week").mean()
Обновлено:
Чтобы получить каждый 10-секундный интервал, теперь, когда я лучше понимаю ваш вопрос... мы можем использовать .strftime
и отформатировать наше время в дневное имя %A
час, минуту, секунду %H%M%S
и сгруппировать по этому.
df["dayTime"] = df.UnixTime.dt.strftime("%A%H%M%S")
df.groupby("dayTime").mean()
Здравствуйте, этот метод разбивает его на 52 недели, я после одной недели, которая будет представлять типичное использование обмена сообщениями в течение всего года с включенными периодами времени. Это даст мне среднее количество сообщений за понедельник, где я хочу получить среднее количество сообщений за каждый период времени в понедельник.
Спасибо, это сработало. Я думал разбить дату на часы, но форматирование даты - гораздо более чистое решение.
Посмотрите на
grouby
. Вы должны быть в состоянии сделать что-то вроде:df.groupby('Day Of Week').mean()
.