【问题标题】:Pandas: Finding the average of every next 10 data points in CSVPandas:在 CSV 中查找每下 10 个数据点的平均值
【发布时间】:2019-07-30 04:28:29
【问题描述】:

我有一个大数据集:

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

数据是从一年中的first 到一年中的lastminute 数据

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

01.01.2018 00:00:00.00005.01.2018 23:59:59.000 的平均值为 05.01.2018

对于06.01.2018,下一个平均值将从02.01.2018 00:00:00.0006.01.2018 23:59:59.000

对于07.01.2018,下一个平均值将从03.01.2018 00:00:00.0007.01.2018 23:59:59.000

等等……

对于给定的一天,有 24 小时 * 60 分钟 = 1440 个数据点。所以我需要得到 1440 个数据点 * 5 天 = 7200 个数据点的平均值。

最终的 DataFrame 将如下所示:

Time,   Value
05.01.2018,  5.1398
06.01.2018,  5.1298
07.01.2018,  5.1438
.... , ,,,,
31.12.2018,  6.3498

底线是计算今天到过去5天的数据平均值,平均值如上图所示。

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

【问题讨论】:

  • rolling(5).mean()?
  • rolling(5).mean() 给出了有希望的输出。我还需要在 DataFrame 中添加 time avg,就像上面的最终 DataFrame 输出一样。
  • @QuangHoang:为了清楚起见,我更新了问题。

标签: python python-3.x pandas


【解决方案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

解决方案

当您按时间窗口滚动时,有趣的是,Pandas 不知道您何时开始一个完整的滚动周期。因此,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

【讨论】:

  • 为了清楚起见,我已经更新了这个问题。对于给定的一天,有 24 小时 * 60 分钟 = 1440 个数据点。所以我需要在第二天获得 1440 个数据点 * 5 天 = 7200 个数据点的平均值……
【解决方案2】:

正如您所说,您有分钟的数据,即每天总是有相同数量的值(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

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2021-12-22
    • 2013-02-11
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多