从2列创建分类数据-Python

从2列创建分类数据-Python,python,pandas,boolean,intervals,Python,Pandas,Boolean,Intervals,我在创建一个数据帧时遇到了一个问题,这个数据帧保存了一个时间间隔,在这个时间间隔内,温度的测量值是在这个时间间隔内。至于现在,数据帧的索引是时间,另一列是度量值,我希望将时间转换为12小时的间隔,度量值是该时间点中值的平均值 measurement time 2016-11-04 08:49:25 17.730000 2016-11-04 10:23:52 18.059999 2016-11-04 11:02:09 18.370

我在创建一个数据帧时遇到了一个问题,这个数据帧保存了一个时间间隔,在这个时间间隔内,温度的测量值是在这个时间间隔内。至于现在,数据帧的索引是时间,另一列是度量值,我希望将时间转换为12小时的间隔,度量值是该时间点中值的平均值

                         measurement
time
2016-11-04 08:49:25    17.730000
2016-11-04 10:23:52    18.059999
2016-11-04 11:02:09    18.370001
2016-11-04 12:04:20    18.090000
2016-11-04 14:26:43    18.320000
因此,与其让每个时间都与测量值相关,不如让我们假设12小时的平均值如下:

                                              measurement
time
2016-11-04 00:00:00 - 2016-11-04 12:00:00     17.730000
2016-11-04 12:00:00 - 2016-11-05 00:00:00     18.059999
2016-11-05 00:00:00 - 2016-11-05 12:00:00     18.370001
2016-11-05 12:00:00 - 2016-11-06 00:00:00     18.090000
2016-11-06 00:00:00 - 2016-11-06 12:00:00     18.320000
                                              17.0-18.0   18.0-19.0  19.0-20
time
2016-11-04 00:00:00 - 2016-11-04 12:00:00         1           0         0
2016-11-04 12:00:00 - 2016-11-05 00:00:00         0           1         0
2016-11-05 00:00:00 - 2016-11-05 12:00:00         0           1         0
2016-11-05 12:00:00 - 2016-11-06 00:00:00         0           1         0
2016-11-06 00:00:00 - 2016-11-06 12:00:00         0           1         0
有没有一种简单的方法可以让熊猫做到这一点

稍后,我还要将测量值转换为间隔,以便数据变成布尔值,如下所示:

                                              measurement
time
2016-11-04 00:00:00 - 2016-11-04 12:00:00     17.730000
2016-11-04 12:00:00 - 2016-11-05 00:00:00     18.059999
2016-11-05 00:00:00 - 2016-11-05 12:00:00     18.370001
2016-11-05 12:00:00 - 2016-11-06 00:00:00     18.090000
2016-11-06 00:00:00 - 2016-11-06 12:00:00     18.320000
                                              17.0-18.0   18.0-19.0  19.0-20
time
2016-11-04 00:00:00 - 2016-11-04 12:00:00         1           0         0
2016-11-04 12:00:00 - 2016-11-05 00:00:00         0           1         0
2016-11-05 00:00:00 - 2016-11-05 12:00:00         0           1         0
2016-11-05 12:00:00 - 2016-11-06 00:00:00         0           1         0
2016-11-06 00:00:00 - 2016-11-06 12:00:00         0           1         0
编辑: 我使用了Coldspeed最先发布的解决方案

df = pd.DataFrame({'timestamp':time.values, 'readings':readings.values})
df = df.groupby(pd.Grouper(key='timestamp', freq='12H'))['readings'].mean()
v = pd.cut(df, bins=[17,18,19,20,21,22,23,24,25,26,27,28], labels=['17-18','18-19','19-20','20-21','21-22','22-23','23-24','24-25','25-26','26-27','27-28'])
我知道,如果没有for循环,垃圾箱和标签本来可以完成,但这只是一个快速修复。 groupby函数,它以12小时的频率对“时间戳”的值进行分组,并获取时间戳中的读数平均值

                         measurement
time
2016-11-04 08:49:25    17.730000
2016-11-04 10:23:52    18.059999
2016-11-04 11:02:09    18.370001
2016-11-04 12:04:20    18.090000
2016-11-04 14:26:43    18.320000
然后使用切割函数将平均值分类为它们的类别

结果:

                     17-18  18-19  19-20  20-21  21-22  22-23  23-24  24-25  \
timestamp
2016-11-04 00:00:00      0      1      0      0      0      0      0      0
2016-11-04 12:00:00      0      1      0      0      0      0      0      0
2016-11-05 00:00:00      0      0      0      0      0      0      0      0
2016-11-05 12:00:00      1      0      0      0      0      0      0      0
2016-11-06 00:00:00      1      0      0      0      0      0      0      0
2016-11-06 12:00:00      0      0      0      0      0      0      0      0
2016-11-07 00:00:00      0      1      0      0      0      0      0      0
2016-11-07 12:00:00      1      0      0      0      0      0      0      0
2016-11-08 00:00:00      0      0      0      0      0      0      0      0
2016-11-08 12:00:00      0      0      0      0      0      0      0      0
2016-11-09 00:00:00      1      0      0      0      0      0      0      0
2016-11-09 12:00:00      1      0      0      0      0      0      0      0
2016-11-10 00:00:00      0      1      0      0      0      0      0      0
2016-11-10 12:00:00      0      0      0      0      0      0      0      0
2016-11-11 00:00:00      0      0      0      0      0      0      0      0
2016-11-11 12:00:00      0      0      0      0      0      0      0      0
2016-11-12 00:00:00      0      0      0      0      0      0      0      0
2016-11-12 12:00:00      0      0      0      0      0      0      0      0
2016-11-13 00:00:00      0      0      0      0      0      0      0      0
2016-11-13 12:00:00      0      0      0      0      0      0      0      0
2016-11-14 00:00:00      0      0      0      0      0      0      0      0
2016-11-14 12:00:00      0      1      0      0      0      0      0      0
2016-11-15 00:00:00      0      0      0      1      0      0      0      0
2016-11-15 12:00:00      0      0      0      0      0      1      0      0
2016-11-16 00:00:00      0      0      0      0      0      0      1      0
2016-11-16 12:00:00      0      0      0      0      0      0      0      0
2016-11-17 00:00:00      0      0      0      0      0      0      0      0

使用
pd.cut
+
pd.get\u假人

v = pd.cut(df.measurement, bins=[17, 18, 19, 20], labels=['17-18', '18-19', '19-20'])
pd.get_dummies(v)

   17-18  18-19  19-20
0      1      0      0
1      0      1      0
2      0      1      0
3      0      1      0
4      0      1      0
df["measurement"] = pd.cut(df["measurement"], bins=[17.0,18.0,19.0,20.0])
dummies = pd.get_dummies(df["measurement"])
您可以使用
pd.cut()
+
pd.get\u dummies()


对于您的第一个问题:您可以使用
pandas.TimeGrouper
按每12小时(或任何其他频率)分组,然后取各组的平均值


df.groupby([pd.TimeGrouper(freq='12H'))).mean()

IIUC您希望按12小时块重新采样,然后创建假人。
pd.cut
是一种完全可以接受的将结果数据剪切到存储箱中的方法。
但是,我使用
np.searchsorted
来完成任务

bins = np.array([17, 18, 19, 20])
labels = np.array(['<17', '17-18', '18-19', '19-20', '>20'])
resampled = df.resample('12H').measurement.mean()
pd.get_dummies(pd.Series(labels[bins.searchsorted(resampled.values)], resampled.index))

                     17-18  18-19  19-20  >20
2018-03-20 00:00:00      0      1      0    0
2018-03-20 12:00:00      1      0      0    0
2018-03-21 00:00:00      0      1      0    0
2018-03-21 12:00:00      0      0      0    1
2018-03-22 00:00:00      0      0      1    0
2018-03-22 12:00:00      0      0      0    1

您的索引与数据不匹配。改造它真的有意义吗?可能是复制品吗?