【问题标题】:How to automatically sum data per range of hour?如何自动对每小时范围内的数据求和?
【发布时间】:2021-06-14 15:49:42
【问题描述】:

我是 Python 的新手!所以这里是我正在做的事情(试图做的事情)的概要。

首先,我想将秒转换为小时。然后,对于一个小时范围内的每个数据,我想将它们相加并找到平均值。

所以 1) 我暂时得到了这个:

hour = 0 
timesummed = [] 
#x axis, total 13 hours of daytime
for i in daytime["d"]:
    hour += i     
    timesummed.append(hour)    

然后我除以 3600 秒得到 13 小时

  daytime['seconds'] = timesummed
    daytime['hours'] = daytime['seconds']/3600 

有效。然而,

  1. 我想添加所有数据并在任何给定小时的范围内找到平均值(例如,第 9 到第 10 小时之间的数据)

我明白了:

liste = []
begin = 0 
mean= 0
for i in range(len(daytime['Sleep'])):
    if daytime["hours"][i]>9 and daytime["hours"][i]<10 and daytime["Sleep"] [i] != 0:
        begin += daytime["Sleep"][i]
        moyenne=begin/len(liste)
        if daytime["Sleep"] [i] == 0:  #ignores zero values (eg twitch)
            continue
        liste.append(begin)
print(begin/len(liste)) 

这也有效,但如何自动获得每小时的平均值? (一口气而不是手动放置范围)

编辑:数据框日间示例:

duration activity Sleep Seconds Hours
201.902 Sleep 201.902 201.902 0.0560
5.4399 Twitch 0.0 207.341 0.0575
66.407 Sleep 66.407 273.749 0.076
0.240 Walk Slowly 0.0 1214.268 0.337
7.685 Groom 0.0 1241.492 0.345

(不等于“睡眠”活动的活动被置为零,因此不予考虑)

【问题讨论】:

  • 这个问题的pandas/dataframe 方面是什么?
  • “自动”是什么意思?
  • @HenryEcker 他们正在使用来自 DataFrame daytime 的列,但 @I_will_learn 的当前解决方案目前不使用任何 DataFrame 或 pandas 功能
  • @I_will_learn 你能提供你的DataFramedaytime的样本吗?这将大大有助于使您的代码可重现,并让我们更好地了解您要完成的工作
  • @DerekO 好了,可以吗?我有超过 8000 行数据,这些数据的价值长达 13 小时,所以我不确定有多少信息就足够了

标签: python python-3.x dataframe for-loop


【解决方案1】:

如果我误解了您的基本问题,请见谅,但按照书面说明有点难以理解。
据我所知,您有一个初始数据框 df,其中包含两列 “duration”'activity',其中记录了超过 13 个连续事件小时期间,您希望组织数据,以便您可以计算 13 小时中每个小时的活动平均值。以下示例说明了初始数据框:
注意:我已扩展您的初始示例以提供几个小时的操作。
df :

    duration    activity
0   201.9020    Sleep
1   5.4399  Twitch
2   66.4070 Sleep
3   0.2400  Walk
4   7.6850  Groom
... ... ...
139 5.4399  Twitch
140 66.4070 Sleep
141 0.2400  Walk
142 7.6850  Groom
143 128.0000    Run
144 rows × 2 columns
# Compute event End Time
df['End_Time'] = df['duration'].cumsum()

# Compute Event Hour
df['Event_Hour'] = df.apply(lambda row: 1+int(row['End_Time']/3600)%24, axis= 1)  

然后定义一个按小时计算平均活动时间的方法

def compute_activity_mean(df, hr):
    #returns tuple containing (sleep_time, active_time, average_active_time)
    sleep_time = 0
    active_time = 0
    dfh = df[['duration', 'activity']].where(df['Event_Hour'] == 1).dropna()
    for i in range(dfh.shape[0]):
        if dfh.at[i, 'activity'] == 'Sleep':
            sleep_time += dfh.at[i, 'duration']
        else:
            active_time += dfh.at[i, 'duration']
    return  [sleep_time, active_time, active_time/(active_time+sleep_time)]  

最终计算并显示每小时增量的平均时间:

for hr in list(df["Event_Hour"].unique()):
    st, at, avgt = compute_activity_mean(df, hr)
    print(f'Hour: {hr}, Active Seconds: {at:.3f}, Sleep Seconds: {st:.3f}, Average Activity: {avgt:.3f}')  

根据您的数据,这将产生以下内容:

Hour: 1, Active Seconds: 1144.284, Sleep Seconds: 2414.781, Average Activity: 0.322
Hour: 2, Active Seconds: 1144.284, Sleep Seconds: 2414.781, Average Activity: 0.322
Hour: 3, Active Seconds: 1144.284, Sleep Seconds: 2414.781, Average Activity: 0.322

【讨论】:

  • 谢谢!我会投票,但我没有声誉。这很有帮助!
  • 我没有为你的答案投票的声望 :( 我需要对我的问题进行投票才能获得 10+ 声望
  • 你是对的,对不起!它现在被接受了:)
  • 没问题,这对我们所有人来说都是一个学习过程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
相关资源
最近更新 更多