按时间索引补全数据脚本
最近在学pandas,做了个小练习。
有一个以不规则时间为索引的csv文件,里面存储了一个小时的数据。现在需要把不连续的帧找到并补全到连续为止。最后的数据默认补到59秒。
输入:
(部分数据)
输出:
(部分数据)
```
# ---------------------------------------------------------------------------------------------------------
# 名 称:数据填充
# 作 者:D.S
# 版 本:1.0
# 功 能:以时间为索引进行数据填充,把不连续的时间帧填补为连续时间并用上一行数据填充。
# 日 期:2019.08.10
# ---------------------------------------------------------------------------------------------------------
# 使用的库:
import pandas as pd
import datetime as dt
from datetime import timedelta
# 定义输入输出路径
pi = 'E:/python_project/data_add/input'
po = 'E:/python_project/data_add/output/result.csv'
# 目标文件
csv = '/test.csv'
# 读取csv文件
csv = pi + csv
di = pd.read_csv(csv)
do = di
# 取出时间,放入列表
t = di.time # 取处di的time列,取处的t是一个Series
t = t.values # 取出Series的值,此时t是一个ndarray
t = t.tolist() # 把ndarray转换成一个列表
# 设置时间为索引
t_d = []
tt = []
# 格式化时间,是为了方便时间计算,判断时间是否连续时需要数据化的时间,
for i in t:
t_d.append(dt.datetime.strptime(i, '%H:%M:%S'))
tt.append(t_d[-1].strftime('%H:%M:%S'))
# 用格式化时间覆盖原时间。
di['time'] = tt
# 以新时间为索引
di.set_index('time', inplace=True)
# 寻找di中的非连续帧并填补
for i in range(len(di)):
if i == len(di)-1:
# 取不连续的帧到dx
dx = di.loc[tt[i], :]
# 从DataFrame中取出单独的一列或者一行是Series类型的数据。需要转化为DataFrame
dx = pd.DataFrame(dx)
# 提取的数据会以列名作为索引,但此处需要时间索引,于是需要一次转置。
dx = dx.T
# 计算需要填补的帧数
delta = 60-t_d[i].second
add_index = [tt[i]]
# 开始填补
t_add = t_d[i]
while delta:
t_add = t_add + timedelta(seconds=1)
add_index.append(t_add.strftime('%H:%M:%S'))
delta -= 1
# 新的索引add_index里面包含了不连续帧数据本身和需要填补的帧数索引。
dx = dx.reindex(add_index[1:], method='ffill')
do = do.append(dx)
break
else:
if t_d[i]+timedelta(seconds=1) != t_d[i+1]: # 找到不连续的帧
# 取不连续的帧到dx
dx = di.loc[tt[i], :]
# 从DataFrame中取出单独的一列或者一行是Series类型的数据。需要转化为DataFrame
dx = pd.DataFrame(dx)
# 提取的数据会以列名作为索引,但此处需要时间索引,于是需要一次转置。
dx = dx.T
# 计算需要填补的帧数
delta = (t_d[i+1]-t_d[i]).seconds-1
add_index = [tt[i]]
# 开始填补
t_add = t_d[i]
while delta:
t_add = t_add + timedelta(seconds=1)
add_index.append(t_add.strftime('%H:%M:%S'))
delta -= 1
# 新的索引add_index里面包含了不连续帧数据本身和需要填补的帧数索引。
dx = dx.reindex(add_index[1:], method='ffill')
do = do.append(dx)
# 每填补一个dx就append原表格。重新排序后输出为csv
do = do.sort_index()
do.to_csv(po)
```