我有一个时间序列数据的CSV文件,该文件的一列标记为oatSensor
(外部空气温度传感器根据来自不同过程的条件进行了过滤),我正在寻找一种将数据分类到“每天”的基础上(如果可能)。
例如,我可以使用下面的代码对整个数据集进行分类。对于外部空气温度值,其增量为-5至55。
import pandas as pd
df = pd.read_csv('ahu1OatFiltHourFilt.csv', index_col='Date', parse_dates=True)
df.describe()
cats = ['-5--1',
'0-4','5-9','10-14','15-19','20-24',
'25-29','30-34','35-39','40-44','45-49','50-54']
bins = [-5, 0,
5, 10, 15, 20, 25, 30, 35,
40, 45, 50, 55]
df2 = (df.groupby([df.index, pd.cut(df['oatSensor'], bins, labels=cats)])
.size()
.unstack(fill_value=0)
.reindex(columns=cats, fill_value=0))
df2.sum(axis = 0)
将输出以下内容:
oatSensor
-5--1 3
0-4 6
5-9 19
10-14 49
15-19 65
20-24 125
25-29 230
30-34 201
35-39 171
40-44 205
45-49 179
50-54 183
dtype: int64
但是最终我希望找到一种方法:
1)为每个bin类别cats
创建单独的df列
df4 = pd.DataFrame(df2, columns=cats)
2)每个day
的每个容器中的sum
重新采样整个数据帧
希望如此,我正在使用的数据在此git repo中。
感谢您的帮助。
编辑
如果我使用df3 = df2.stack()
,那么除了重采样外,这为我提供了我想要的东西,但是我将如何实现创建单独的cats
数据帧,然后每天对它们进行重采样?>
Date oatSensor
2018-09-26 05:00:00 -5--1 0
0-4 0
5-9 0
10-14 0
15-19 0
20-24 0
25-29 0
30-34 0
35-39 0
40-44 0
45-49 0
50-54 1
2018-09-26 06:00:00 -5--1 0
0-4 0
5-9 0
10-14 0
15-19 0
20-24 0
25-29 0
30-34 0
35-39 0
40-44 0
45-49 0
50-54 1
答案 0 :(得分:1)
尝试此代码。祝你好运;)
import pandas as pd
distance = 5
url = 'https://raw.githubusercontent.com/bbartling/Data/master/ahu1OatFiltHourFilt.csv'
df = pd.read_csv(url)
df['Date'] = pd.to_datetime(df['Date'])
min = df.oatSensor.min()
max = df.oatSensor.max()
min = int(min - (min % distance))
max = int(max + distance - (max % distance))
labels = ["{0} - {1}".format(i, i + distance) for i in range(min, max,
distance)]
df['group'] = pd.cut(df.oatSensor, range(min, max + distance, distance),
right=False, labels=labels)
df2 = df.groupby(['group']).count()
df['one'] = 1
df3 = df.pivot_table('one','Date','group')
print(df3.tail())
退出:
# group -5 - 0 0 - 5 5 - 10 ... 85 - 90 90 - 95 95 - 100
# Date ...
# 2019-07-06 13:00:00 NaN NaN NaN ... NaN NaN NaN
# 2019-07-06 14:00:00 NaN NaN NaN ... NaN NaN NaN
# 2019-07-06 15:00:00 NaN NaN NaN ... NaN NaN NaN
# 2019-07-06 16:00:00 NaN NaN NaN ... NaN NaN NaN
# 2019-07-09 15:00:00 NaN NaN NaN ... 1.0 NaN NaN
答案 1 :(得分:0)
我认为您想要的是一个数据框,其中每一行是您所描述的bin中看到的观测值总数的总和,并按观测日期进行索引。
如果是真的,那么我认为您超级棒,超级亲密!
更改
df2 = (df.groupby([df.index, pd.cut(df['oatSensor'], bins, labels=cats)])
.size()
.unstack(fill_value=0)
.reindex(columns=cats, fill_value=0))
阅读:
df2 = (df.groupby([df.index.date, pd.cut(df['oatSensor'], bins, labels=cats)])
.size()
.unstack(fill_value=0)
.reindex(columns=cats, fill_value=0))
更改是将.date
添加到groupby
中的第一个参数。这将为您提供如上所述的数据框。
我不确定每个cat
都有单独的数据帧。从创建的数据框 中,您可以轻松地为任何列创建新的df:
df_cat = df2['-5--1']