熊猫:在CSV中查找每隔10个数据点的平均值

时间:2019-06-27 19:59:29

标签: python python-3.x pandas

我有一个大型数据集:

Time,   Value
01.01.2018 00:00:00.000,  5.1398
01.01.2018 00:01:00.000,  5.1298
01.01.2018 00:02:00.000,  5.1438
01.01.2018 00:03:00.000,  5.1228
01.01.2018 00:04:00.000,  5.1168
.... , ,,,,
31.12.2018 23:59:59.000,  6.3498

数据是minute数据,从每年的first到每年的last

我想使用Pandas来查找每5天的平均值。例如:

01.01.2018 00:00:00.000的平均值从05.01.2018 23:59:59.00005.01.2018

下一个平均值将从02.01.2018 00:00:00.000的{​​{1}}到6.01.2018 23:59:59.000

下一个平均值将从06.01.2018的{​​{1}}到03.01.2018 00:00:00.000

以此类推...

  

在给定的一天中,有24小时* 60分钟= 1440个数据点。因此,我需要获取1440个数据点的平均值* 5天= 7200个数据点。

最终的DataFrame如下所示:

7.01.2018 23:59:59.000

最重要的是计算从今天到过去5天的平均值,平均值如上所示。

我尝试遍历Python循环,但是我想要比Pandas更好的东西。

2 个答案:

答案 0 :(得分:1)

IIUC

您要进行滚动平均,然后每天重新采样。

设置

df = pd.DataFrame(dict(
    Time=pd.date_range('2018-01-01', '2018-01-7 23:59', freq='12H')
)).assign(Value=lambda d: np.arange(len(d)))

df['Time'] = pd.to_datetime(df['Time'])
df = df.set_index('Time')

df

                 Value
Time                      
2018-01-01 00:00:00      0
2018-01-01 12:00:00      1
2018-01-02 00:00:00      2
2018-01-02 12:00:00      3
2018-01-03 00:00:00      4
2018-01-03 12:00:00      5
2018-01-04 00:00:00      6
2018-01-04 12:00:00      7
2018-01-05 00:00:00      8
2018-01-05 12:00:00      9
2018-01-06 00:00:00     10
2018-01-06 12:00:00     11
2018-01-07 00:00:00     12
2018-01-07 12:00:00     13

解决方案

按时间窗口滚动时有趣的是,熊猫不知道您何时开始一个完整的滚动周期。因此,df.rolling('5D').mean()将立即开始计算均值。您可以通过每天重新采样后减少前5天(或4天)的时间来解决此问题。

df.rolling('5D').mean().resample('D').last().iloc[4:]

            Value
Time             
2018-01-05    4.5
2018-01-06    6.5
2018-01-07    8.5

答案 1 :(得分:1)

正如您所说的那样,您有分钟的数据,即每天总是有相同数量的值(1440),那么您可以简单地采用每日平均值,然后取5这些日常手段的每日滚动窗口。

示例(值是一年中的运行分钟数,从0开始):

s = pd.Series(pd.date_range('2018-01-01', '2018-12-31 23:59', freq='1T'))
df = pd.DataFrame(s.index.values, index=s, columns=['Value'])
df.groupby(df.index.floor('d'))['Value'].mean().rolling(5).mean().dropna() 

结果:

2018-01-05      3599.5
2018-01-06      5039.5
2018-01-07      6479.5
2018-01-08      7919.5
                ...   
2018-12-28    517679.5
2018-12-29    519119.5
2018-12-30    520559.5
2018-12-31    521999.5