用月平均值填补数据空白(Python)

时间:2014-01-08 11:31:11

标签: python for-loop pandas average interpolation

我有一个很长的时间序列超过10年,半小时测量为Csv文件。时不时的测量设备都会崩溃。我想用月平均值或移动平均线(忽略缺失值)来插入这个间隙。我想我需要一个for循环才能做到这一点,但我不知道怎么做到这一点。有人能帮助我吗? 我的数据如下所示:

10-Oct-2010 21:15   0.00271
10-Oct-2010 21:45   0.00408
10-Oct-2010 22:15   -0.00228
10-Oct-2010 22:45   0.00433
10-Oct-2010 23:15   0.00421
10-Oct-2010 23:45   0.00224
11-Oct-2010 00:15   -0.01678
11-Oct-2010 00:45   -0.00059
11-Oct-2010 01:15   -0.00371
11-Oct-2010 01:45   0.01353
11-Oct-2010 02:15   0.00108
11-Oct-2010 02:45   0.00101
11-Oct-2010 03:15   -0.00159
11-Oct-2010 03:45   0.0011

我目前的代码是:

import pandas as pd
ts = pd.read_csv('C:\Python27\Scripts\ET_T_2000.csv', sep=';', parse_dates=[['date', 'time']])
ts1 = ts.set_index('date_time')['ET'].resample('D', how='sum')
ts1.to_csv('sum.csv')

所以我得到了蒸发数据的每日总和。我也可以重新计算每月的每日平均值,但我不知道如何告诉Python它需要使用每个差距这个特定月份的平均值。

4 个答案:

答案 0 :(得分:1)

如果您在元组(timestamp, value)的列表(唉,您没有说明数据结构)中获得了值:

data = [ (1, 3.), (2, 5.), (3, 0.), (6, 3.), (7, 3.), (9, 2.), (10, 0.) ]
timestampDistance = 1

def interpolateGap(ts0, v0, ts1, v1):
  count = (ts1 - ts0) / timestampDistance
  return [ (ts0 + i * timestampDistance, v0 + (v1 - v0) * i / count)
    for i in range(1, count) ]

def fillGap(data, pos, ts0, v0, ts1, v1):
  data[pos+1:pos] = interpolateGap(ts0, v0, ts1, v1)

for i in range(len(data)-1, 1, -1):
  timestamp, value = data[i]
  previousTimestamp, previousValue = data[i-1]
  if previousTimestamp + timestampDistance < timestamp:
    fillGap(data, i-1, previousTimestamp, previousValue, timestamp, value)

print data

这将打印

[(1, 3.0), (2, 5.0), (3, 0.0), (4, 1.0), (5, 2.0), (6, 3.0), (7, 3.0), (8, 2.5), (9, 2.0), (10, 0.0)]

答案 1 :(得分:1)

注意:这应该是评论,但我没有代表:)

Pandas在系列和数据帧上都有一个很好的'插值'功能:(http://pandas.pydata.org/pandas-docs/dev/missing_data.html#interpolation)。我将建议,特别是如果您有“几天”缺失数据,您只需将值保留为NaN(http://pandas.pydata.org/pandas-docs/dev/missing_data.html#working-with-missing-data)。 Pandas非常支持具有NA值的图,并且看到具有正确测量值的图,然后很容易解释“间隙”。此外,该方法还提供了额外的信息,假设您正在查看图表,并且您发现周末比其他日子有更多的间隙,这可能表明测量设备在周末(或其他)不太稳定。

答案 2 :(得分:1)

由于存在如此大的缺失值差距,我猜你真的会更好,将它们保留为NAN,并调整计算,以便它们可以处理丢失的数据。看起来你正在用它进行财务模拟,从长远来看,如果你修改实际的原始数据,它总会适得其反。如果您使用Numpy进行计算,Bottleneck会添加一堆修改过的函数,这些函数会跳过数组中的NAN值,例如:在计算手段等时。更好地继续下去!

答案 3 :(得分:0)

不管你做什么,都要更改源数据:始终保持原始数据不变。

然后,数据的任何消费者都可以决定与数据显示内容以及他们打算如何处理相关的特定插值方案。

特别是,如果您正在对数据进行一些波动率分析,那么您的内插值会产生人为地减少波动率的效果。

PS 你说你有一个字符分隔值文件,但是分隔符是什么?)