这是我的数据:
除了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()
我需要填补这个缺失的差距,其他人填写所有字段的值(例如timestamp
,temperature
,humidity
,light
,pressure
,{ {1}},speed
等等......)。
如何用熊猫来实现这个目标?
这是我以前做过的
battery_voltage
总和的值不正确。因为2017-06-17的价值是2017-06-12到2017-06-16的总和。我不想再添加它们。这一差距不仅是这一时期的一个缺口。我想填补所有这些。
答案 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