/ / Розбиття кадру даних на декілька 5-секундних кадрів даних і отримання кількості в Python - python, pandas, datetime, split, group-by

Розбиття кадру даних на кілька 5-секундних кадрів даних і отримання підрахунку в Python - python, pandas, datetime, split, group-by

У мене є досить великий набір даних, який я хочу розділити на декілька кадрів даних у Python на основі стовпця, що містить об'єкт datetime. Значення в стовпці (я хочу розділити кадр даних) наведено у такому форматі:

  1. 2015-11-01 00:00:05

Можна припустити, що кадр даних виглядає так.

Як я можу розділити кадр даних на 5-секундні інтервали наступним чином:

  1. Перший кадр даних 2015-11-01 00:00:00 - 2015-11-01 00:00:05,

  2. Другий кадр даних 2015-11-01 00:00:05 - 2015-11-01 00:00:10, і так далі.

Мені також потрібно підрахувати кількість спостережень у кожному з результуючих кадрів даних. Іншими словами, було б добре, якби я міг отримати інший кадр даних з 2 стовпцями (бажаний формат виводу можна знайти нижче):

введіть опис зображення тут

  • 1-й стовпець представляє розділену групу (значенняцієї колонки не має значення: вони можуть бути просто 1, 2, 3, .., що вказує на порядок 5-секундних інтервалів, наприклад, 1 може стосуватися періоду 2015-11-01 00:00:00 - 2015-11-01 00:00:05, 2 могло ставитися до періоду 2015-11-01 00:00:05 - 2015-11-01 00:00:10 і так далі),
  • 2-а колонка показує кількість спостережень, що падають у кожному відповідному інтервалі.

Відповіді:

2 для відповіді № 1

Створити dictionary of DataFrames і додати новий стовпчик з assign:

rng = pd.date_range("2015-11-01 00:00:00", periods=100, freq="S")
df = pd.DataFrame({"Date": rng, "a": range(100)})
print (df.head(10))
Date  a
0 2015-11-01 00:00:00  0
1 2015-11-01 00:00:01  1
2 2015-11-01 00:00:02  2
3 2015-11-01 00:00:03  3
4 2015-11-01 00:00:04  4
5 2015-11-01 00:00:05  5
6 2015-11-01 00:00:06  6
7 2015-11-01 00:00:07  7
8 2015-11-01 00:00:08  8
9 2015-11-01 00:00:09  9

g = df.groupby(pd.Grouper(key="Date", freq="5S"))

dfs = {k.strftime("%Y-%m-%d %H:%M:%S"):v.assign(A=range(1,len(v)+1), B=len(v)) for k,v in g}

print (dfs["2015-11-01 00:00:05"])
Date  a  A  B
5 2015-11-01 00:00:05  5  1  5
6 2015-11-01 00:00:06  6  2  5
7 2015-11-01 00:00:07  7  3  5
8 2015-11-01 00:00:08  8  4  5
9 2015-11-01 00:00:09  9  5  5

При необхідності підрахуйте рядки першого агрегату size і для Interval є додати 1 до індексу:

df1 = df.groupby(pd.Grouper(key="Date", freq="5S")).size().reset_index(name="Count")
df1["Interval"] = df1.index + 1
print (df1.head())
Date  Count  Interval
0 2015-11-01 00:00:00      5         1
1 2015-11-01 00:00:05      5         2
2 2015-11-01 00:00:10      5         3
3 2015-11-01 00:00:15      5         4
4 2015-11-01 00:00:20      5         5