熊猫:按时钟时间计算平均值和标准偏差

时间:2021-03-20 11:30:11

标签: python pandas dataframe

我有一个这样的 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

DataFrame 包含 2019 年全年每 10 秒记录的值。我需要计算每个日期每小时 value 的标准偏差和平均值,并为它们创建两个新列。我首先尝试将每个值的小时分开,例如:

df["hour"] = df["time"].astype(str).str[:2]

然后我尝试通过以下方式计算标准偏差:

df["std"] = df.groupby("hour").median().index.get_level_values('value').stack().std()

但这行不通,我可以就这个问题提出一些建议吗?

2 个答案:

答案 0 :(得分:4)

我们可以split围绕分隔符time的{​​{1}}列,然后使用:hour组件进行切片,最后str[0]数据框在 group 以及 date 组件和带有 hourvalue 的聚合列 mean 上:

std

如果您想将聚合值hr = df['time'].str.split(':', n=1).str[0] df.groupby(['date', hr])['value'].agg(['mean', 'std']) 转换为原始数据框,那么我们需要使用 broadcast 而不是 transform

agg

g = df.groupby(['date', df['time'].str.split(':', n=1).str[0]])['value']
df['mean'], df['std'] = g.transform('mean'), g.transform('std')

答案 1 :(得分:1)

  • 有综合数据。首先生成一个真正的日期时间
  • groupby() 小时
  • 使用 describe() 得到 meanstd
  • merge() 返回原始数据框
d = pd.date_range("1-Jan-2019", "28-Feb-2019", freq="10S")
df = pd.DataFrame({"datetime":d, "value":np.random.uniform(70,90,len(d))})

df = df.assign(date=df.datetime.dt.strftime("%Y-%m-%d"),
              time=df.datetime.dt.strftime("%H:%M:%S"))

# create a datetime column - better than manipulating strings
df["datetime"] = pd.to_datetime(df.date + " " + df.time)

# calc mean & std by hour
dfh = (df.groupby(df.datetime.dt.hour, as_index=False)
 .apply(lambda dfa: dfa.describe().T.loc[:,["mean","std"]].reset_index(drop=True))
 .droplevel(1)
)

# merge mean & std by hour back
df.merge(dfh, left_on=df.datetime.dt.hour, right_index=True).drop(columns="key_0")
    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