学习记录1:数据填充脚本

按时间索引补全数据脚本

最近在学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)

```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值