我想根据第一个日期时间索引找到数据集的年均值。 假设以下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
我要实现的目标是找到以下数据之间的平均值:
我熟悉使用Pandas进行分组的情况,但是并没有给我想要的结果。另一种解决方案是手动切片数据帧,但是如果数据帧包含10多年的数据,则将非常耗时。
Pandas(或其他任何库)中是否有内置方法可以做到这一点?
答案 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年的时间增量。如果这对您不那么重要,那么这可能是一个不错的方法。