根据在熊猫中经过的时间计算平均值

时间:2019-04-22 02:54:38

标签: python pandas time

我以前曾尝试问过这个问题,但是它太模棱两可了,所以再来一次。我是编程新手,所以我仍在学习如何以一种有用的方式提出问题。

总而言之,我有一个熊猫数据框,类似于“ INPUT DATA”,我想将其转换为“ DESIRED OUTPUT”,如下所示。

每行包含一个ID,一个DateTime和一个Value。对于每个唯一ID,第一行对应于时间点“零”,随后的每一行在上一行之后的5分钟内包含一个值,依此类推。

我想计算每个“经过时间”时间点所有ID的平均值。例如,在“期望的输出”中,经过的时间= 0.0将具有值128.3(100 + 105 + 180/3);经过的时间= 5.0将具有值150.0(150 + 110 + 190/3);经过时间= 10.0的值为133.3(125 + 90 + 185/3),以此类推,对于经过时间= 15、20、25等。

我不确定如何创建一个新列,该列具有每个ID所用时间的值(例如0.0、5.0、10.0等)。我认为,一旦我知道该怎么做,就可以使用groupby函数来计算每次经过的均值。

输入数据

ID  DateTime            Value
1   2018-01-01 15:00:00 100
1   2018-01-01 15:05:00 150
1   2018-01-01 15:10:00 125
2   2018-02-02 13:15:00 105
2   2018-02-02 13:20:00 110
2   2018-02-02 13:25:00 90
3   2019-03-03 05:05:00 180
3   2019-03-03 05:10:00 190
3   2019-03-03 05:15:00 185

期望的输出


Time Elapsed    Mean Value
0.0             128.3
5.0             150.0
10.0            133.3

2 个答案:

答案 0 :(得分:1)

这是一种方法,将transformgroupby一起使用可获取组密钥'Time Elapsed',然后仅groupby即可获得mean

df['Time Elapsed']=df.DateTime-df.groupby('ID').DateTime.transform('first')
df.groupby('Time Elapsed').Value.mean()
Out[998]: 
Time Elapsed
00:00:00    128.333333
00:05:00    150.000000
00:10:00    133.333333
Name: Value, dtype: float64

答案 1 :(得分:0)

您可以利用datetimeDateTime列的DataFrame属性来明确地做到这一点

首先获取每个DateTime的年,月和日,因为它们都在您的数据中发生变化

df['month'] = df['DateTime'].dt.month
df['day'] = df['DateTime'].dt.day
df['year'] = df['DateTime'].dt.year

print(df)
   ID            DateTime  Value  month  day  year
1   1 2018-01-01 15:00:00    100      1    1  2018
1   1 2018-01-01 15:05:00    150      1    1  2018
1   1 2018-01-01 15:10:00    125      1    1  2018
2   2 2018-02-02 13:15:00    105      2    2  2018
2   2 2018-02-02 13:20:00    110      2    2  2018
2   2 2018-02-02 13:25:00     90      2    2  2018
3   3 2019-03-03 05:05:00    180      3    3  2019
3   3 2019-03-03 05:10:00    190      3    3  2019
3   3 2019-03-03 05:15:00    185      3    3  2019

然后附加一个连续的DateTime计数器列(每个this SO post

  • 该计数器是在每年(1),每个月(2),然后每个月,然后每天(3)内计算的。
  • 由于数据的长度为5分钟的倍数,因此请使用此值来缩放计数器值(即,计数器的长度将为5分钟的倍数,而不是递增的整数序列)
df['Time Elapsed'] = df.groupby(['year', 'month', 'day']).cumcount() + 1
df['Time Elapsed'] *= 5

print(df)
   ID            DateTime  Value  month  day  year  cumulative_record
1   1 2018-01-01 15:00:00    100      1    1  2018                  5
1   1 2018-01-01 15:05:00    150      1    1  2018                 10
1   1 2018-01-01 15:10:00    125      1    1  2018                 15
2   2 2018-02-02 13:15:00    105      2    2  2018                  5
2   2 2018-02-02 13:20:00    110      2    2  2018                 10
2   2 2018-02-02 13:25:00     90      2    2  2018                 15
3   3 2019-03-03 05:05:00    180      3    3  2019                  5
3   3 2019-03-03 05:10:00    190      3    3  2019                 10
3   3 2019-03-03 05:15:00    185      3    3  2019                 15

在新添加的计数器列上执行groupby

dfg = df.groupby('Time Elapsed')['Value'].mean()

print(dfg)
Time Elapsed
5     128.333333
10    150.000000
15    133.333333
Name: Value, dtype: float64