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:
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º dataframe
2015-11-01 00:00:00 - 2015-11-01 00:00:05
,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):
- 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 № 1Crio dictionary of DataFrame
s 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