如何在timeSeries中填写缺少的日期

时间:2017-12-07 09:02:59

标签: python pandas

这是我的数据:

my data looks like this

除了2017-06-12至2017-06-16之间的差距外,还有每日记录。

df2['timestamp'] = pd.to_datetime(df['timestamp'])
df2['timestamp'] = df2['timestamp'].map(lambda x: 
datetime.datetime.strftime(x,'%Y-%m-%d'))
df2 = df2.convert_objects(convert_numeric = True)
df2 = df2.groupby('timestamp', as_index = False).sum()

我需要填补这个缺失的差距,其他人填写所有字段的值(例如timestamptemperaturehumiditylightpressure,{ {1}},speed等等......)。

如何用熊猫来实现这个目标?

这是我以前做过的

battery_voltage

总和的值不正确。因为2017-06-17的价值是2017-06-12到2017-06-16的总和。我不想再添加它们。这一差距不仅是这一时期的一个缺口。我想填补所有这些。

2 个答案:

答案 0 :(得分:0)

这是我写的一个可能对你有帮助的函数。它会在时间上查找不一致的跳转并填充它们。使用此函数后,尝试使用线性插值函数(pandas有一个很好的函数)来填充空数据值。注意:Numpy数组比Pandas数据帧迭代和操作要快得多,这就是我在两者之间切换的原因。

import numpy as np
import pandas as pd

data_arr = np.array(your_df)
periodicity = 'daily'

def fill_gaps(data_arr, periodicity):
    rows = data_arr.shape[0]
    data_no_gaps = np.copy(data_arr) #avoid altering the thing you're iterating over
    data_no_gaps_idx = 0

    for row_idx in np.arange(1, rows): #iterate once for each row (except the first record; nothing to compare)
        oldtimestamp_str = str(data_arr[row_idx-1, 0]) 
        oldtimestamp = np.datetime64(oldtimestamp_str)  

        currenttimestamp_str = str(data_arr[row_idx, 0])
        currenttimestamp = np.datetime64(currenttimestamp_str)

        period = currenttimestamp - oldtimestamp

        if period != np.timedelta64(900,'s') and period != np.timedelta64(3600,'s') and period != np.timedelta64(86400,'s'):                                
            if periodicity == 'quarterly':
                desired_period = 900
            elif periodicity == 'hourly':
                desired_period = 3600
            elif periodicity == 'daily':
                desired_period = 86400

            periods_missing = int(period / np.timedelta64(desired_period,'s'))
            for missing in np.arange(1, periods_missing):
                new_time_orig = str(oldtimestamp + missing*(np.timedelta64(desired_period,'s')))
                new_time = new_time_orig.replace('T', ' ')
                data_no_gaps = np.insert(data_no_gaps, (data_no_gaps_idx + missing), 
                                 np.array((new_time, np.nan, np.nan, np.nan, np.nan, np.nan)), 0) # INSERT VALUES YOU WANT IN THE NEW ROW

            data_no_gaps_idx += (periods_missing-1) #incriment the index (zero-based => -1) in accordance with added rows

        data_no_gaps_idx += 1 #allow index to change as we iterate over original data array (main for loop)

    #create a dataframe:
    data_arr_no_gaps = pd.DataFrame(data=data_no_gaps, index=None,columns=['Time', 'temp', 'humidity', 'light', 'pressure', 'speed'])

    return data_arr_no_gaps  

答案 1 :(得分:0)

填充时间间隔和空值

使用下面的函数确保预期的日期序列存在,然后使用正向填充来填充空值。

inline