如何从开始日期算起一年找到Pandas DataFrame的平均值?

时间:2019-02-20 10:08:58

标签: python pandas dataframe

我想根据第一个日期时间索引找到数据集的年均值。 假设以下DataFrame:

    Date/Time                 speed       
2015-03-21 14:00:00           11.256
2015-03-21 14:10:00           13.789
2015-03-21 14:20:00           16.297
2015-03-21 14:30:00           11.259
...                              ...
2018-03-21 14:00:00            8.211
2018-03-21 14:10:00            5.324
2018-03-21 14:20:00            5.316
2018-03-21 14:30:00            2.982

我要实现的目标是找到以下数据之间的平均值

  • 2015-03-21 14:00:00 2016-03-21 13:50:00
  • 2016-03-21 14:00:00 2017-03-21 13:50:00
  • 2017-03-21 14:00:00 2018-03-21 13:50:00

我熟悉使用Pandas进行分组的情况,但是并没有给我想要的结果。另一种解决方案是手动切片数据帧,但是如果数据帧包含10多年的数据,则将非常耗时。

Pandas(或其他任何库)中是否有内置方法可以做到这一点?

3 个答案:

答案 0 :(得分:0)

leap年存在问题,因此无法重新采样或使用<div class="container"> <input type="button" id="input0"> <input type="button" id="input1"> <input type="button" id="input2"> <input type="button" id="input3"> <input type="button" id="input4"> <input type="button" id="input5"> <input type="button" id="input6"> <input type="button" id="input7"> <input type="button" id="input8"> </div>,最简单的是使用最小和最大年限的范围循环,并使用f字符串填充:

Timedelta

另一种解决方案更复杂,但也可以与years年一起使用-将想法每年分成两个部分-在脱粒日期时间之前和之后,然后相加。

np.random.seed(2019)

rng = pd.date_range('2015-03-21 14:00:00', '2018-03-21 14:30:00', freq='10T')
df = pd.DataFrame({'speed':np.random.randint(1000, size=len(rng))}, index=rng)
#print (df)


out = pd.Series({x: df.loc[f'{x}-03-21 14:00:00':f'{x+1}-03-21 13:50:00', 'speed'].mean()
                   for x in range(df.index.year.min(), df.index.year.max()+1)})
print (out)
2015    501.062879
2016    498.546385
2017    498.490963
2018    580.250000
dtype: float64

#datetime for thresh - always need leeap year like 2000
date = pd.Timestamp('2000-03-21 14:00:00')
#replace all years to 2000 and test data fr matched conditions
mask = pd.to_datetime(df.index.strftime('2000-%m-%d %H:%M:%S')) < date
arr = np.where(mask, 'matched','nonmatched')

#sum of means have no sense, so need working mean = sum/count
df1 = df.groupby([arr, df.index.year])['speed'].agg(['sum','size'])
print (df1)
                      sum   size
matched    2016   5811589  11604
           2017   5725034  11460
           2018   5702078  11460
nonmatched 2015  20596429  41100
           2016  20478564  41100
           2017  20498607  41100
           2018      2321      4

答案 1 :(得分:0)

要选择带有日期时间索引的数据帧df的时间戳,请使用df.loc

start = df.index[0]
dt = pd.Timedelta(1, unit="Y")
first_year_mean = df.loc[start:start+dt].mean()

答案 2 :(得分:0)

一种方法是使用loffset的{​​{1}}参数。

pandas.DataFrame.resample

此方法的唯一缺点是,它不会调整leap年的时间增量。如果这对您不那么重要,那么这可能是一个不错的方法。