簡體   English   中英

Pandas:按時鍾時間計算平均值和標准偏差

[英]Pandas: compute average and standard deviation by clock time

我有一個像這樣的 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()

但這不起作用,我可以就這個問題提出一些建議嗎?

我們可以在分隔符:周圍split time列,然后使用str[0]hour分量進行切片,最后將date上的 dataframe 與hour分量一起group ,並用meanstd聚合列value

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

如果要將聚合值broadcast到原始 dataframe,那么我們需要使用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')

         date      time  value   mean       std
0  2019-04-18  07:00:10  100.8  94.55  5.434151
1  2019-04-18  07:00:20   95.6  94.55  5.434151
2  2019-04-18  07:00:30   87.6  94.55  5.434151
3  2019-04-18  07:00:40   94.2  94.55  5.434151
  • 有合成數據。 首先生成一個真正的日期時間
  • groupby()小時
  • 使用describe()獲取均值標准差
  • 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM