Python 熊猫:按时钟时间计算平均值和标准偏差
我有这样一个数据帧:Python 熊猫:按时钟时间计算平均值和标准偏差,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个数据帧: date time value 0 2019-04-18 07:00:10 100.8 1 2019-04-18 07:00:20 95.6 2 2019-04-18 07:00:30 87.6 3 2019-04-18 07:00:40 94.2 数据帧包含2019年全年每10秒记
date time value
0 2019-04-18 07:00:10 100.8
1 2019-04-18 07:00:20 95.6
2 2019-04-18 07:00:30 87.6
3 2019-04-18 07:00:40 94.2
数据帧包含2019年全年每10秒记录的值。我需要计算每个日期每小时的标准偏差和值的平均值,并为它们创建两个新列。我尝试先将每个值的小时分开,如:
df["hour"] = df["time"].astype(str).str[:2]
然后,我尝试通过以下方式计算标准偏差:
df["std"] = df.groupby("hour").median().index.get_level_values('value').stack().std()
但这行不通,我能就这个问题提出一些建议吗?我们可以拆分分隔符周围的时间列:
,然后使用str[0]
对小时组件进行切片,最后,将日期
上的数据框
与小时
组件和聚合列
值
与平均值
和标准
:
hr = df['time'].str.split(':', n=1).str[0]
df.groupby(['date', hr])['value'].agg(['mean', 'std'])
如果您想将聚合值广播到原始数据帧,那么我们需要使用转换
而不是agg
:
g = df.groupby(['date', df['time'].str.split(':', n=1).str[0]])['value']
df['mean'], df['std'] = g.transform('mean'), g.transform('std')
我们可以拆分
分隔符周围的时间列:
,然后使用str[0]
对hour
组件进行切片,最后,将日期
上的数据框
与小时
组件和聚合列
值
与平均值
和标准
:
hr = df['time'].str.split(':', n=1).str[0]
df.groupby(['date', hr])['value'].agg(['mean', 'std'])
如果您想将聚合值广播到原始数据帧,那么我们需要使用转换
而不是agg
:
g = df.groupby(['date', df['time'].str.split(':', n=1).str[0]])['value']
df['mean'], df['std'] = g.transform('mean'), g.transform('std')
- 我们已经合成了数据。首先生成一个真正的datetime列
groupby()
hour
- 使用
descripe()
获取mean和std
merge()
返回原始数据帧
- 我们已经合成了数据。首先生成一个真正的datetime列
groupby()
hour
- 使用
descripe()
获取mean和std
merge()
返回原始数据帧
如何将mean和std作为两个新列添加到DataFrame?是否要在原始DataFrame中添加这些列?在这种情况下,我们需要transform
而不是agg
。是的,最好将它们添加到原始数据框中以供进一步使用。@Mr.Engineer我已经编辑了答案。我如何将mean和std作为两个新列添加到数据框中?是否要将这些列添加到原始数据框中?在这种情况下,我们需要transform
而不是agg
。是的,最好将它们添加到原始数据帧中以供进一步使用。@Mr.Engineer我已经编辑了答案。这会引发异常dataframe'对象没有属性'datetime'@Mr.Engineer:datetime
是这里第2行定义的数据帧中的一列。您必须稍微修改代码以适应特定的数据帧,例如,通过将日期和时间列组合成日期时间列。我更改了答案,最好使用pandaas datetime此抛出异常数据框“对象没有属性‘datetime’@Mr.Engineer:datetime
是数据框中的一列,在这里的第2行中定义。您必须稍微修改代码以适应特定的数据帧,例如,通过将日期和时间列合并到日期时间列中。我更改了答案,最好使用pandaas datetime“我需要计算每个单独日期的每小时的标准偏差和值的平均数/平均数”,或不考虑日期的总体值,例如。“每天凌晨2-3点的stdev和值的平均值/平均值”?@smci对于每个单独的日期,请参阅下面的公认解决方案。与其说“这不起作用”,不如解释该代码到底出了什么问题,或者如果它导致了错误,请说明是哪个错误。”我需要计算每个单独日期的stdev和每小时的值的平均值/平均值,或不考虑日期的总体值,例如“所有日期凌晨2-3点的stdev和值的平均值/平均值”?@smci对于每个单独日期,请参阅下面接受的解决方案。也不要说“这不起作用”,最好解释代码到底做错了什么,或者如果它导致了错误,请说明是哪个错误。
datetime value mean std
0 2019-01-01 00:00:00 86.014209 80.043364 5.777724
1 2019-01-01 00:00:10 77.241141 80.043364 5.777724
2 2019-01-01 00:00:20 71.650739 80.043364 5.777724
3 2019-01-01 00:00:30 71.066332 80.043364 5.777724
4 2019-01-01 00:00:40 77.203291 80.043364 5.777724
... ... ... ... ...
3144955 2019-12-30 23:59:10 89.577237 80.009751 5.773007
3144956 2019-12-30 23:59:20 82.154883 80.009751 5.773007
3144957 2019-12-30 23:59:30 82.131952 80.009751 5.773007
3144958 2019-12-30 23:59:40 85.346724 80.009751 5.773007
3144959 2019-12-30 23:59:50 78.122761 80.009751 5.773007