/ / Divisão de um dataframe em vários quadros de dados de 5 segundos e obtenção de contagem em Python - python, pandas, datetime, split, group-by

Divide um dataframe em vários dataframes de 5 segundos e obtém a contagem em Python - python, pandas, datetime, split, group-by

Eu tenho um conjunto de dados relativamente grande que eu quero dividir em vários dataframes em Python baseado em uma coluna contendo um objeto datetime. Os valores na coluna (que eu quero dividir o dataframe por) são fornecidos no seguinte formato:

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

Você pode assumir que o dataframe se parece com isso.

Como posso dividir o dataframe em intervalos de 5 segundos Da seguinte maneira:

  1. 1º dataframe 2015-11-01 00:00:00 - 2015-11-01 00:00:05,

  2. 2º dataframe 2015-11-01 00:00:05 - 2015-11-01 00:00:10, e assim por diante.

Eu também preciso contar o número de observações em cada um dos dataframes resultantes. Em outras palavras, seria legal se eu conseguisse outro dataframe com 2 colunas (o formato de saída desejado pode ser encontrado abaixo):

insira a descrição da imagem aqui

  • 1a coluna representa o grupo dividido (valoresdesta coluna não importa: eles poderiam ser simplesmente 1, 2, 3, .. indicando a ordem dos intervalos de 5 segundos, por exemplo, 1 poderia se referir ao período 2015-11-01 00:00:00 - 2015-11-01 00:00:05, 2 poderia se referir ao período 2015-11-01 00:00:05 - 2015-11-01 00:00:10 e assim por diante),
  • A segunda coluna mostra o número de observações que caem em cada intervalo respectivo.

Respostas:

2 para resposta № 1

Crio dictionary of DataFrames e adicionar nova coluna com 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

Se precisar contar linhas primeiro aggreagte size e para Interval é adicionar 1 ao índice:

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