pandas(八)--实战一下

news2024/9/29 15:30:37

背景

收到一批数据,数据形式。采集数据的间隔时间是10分钟,全天采集数据,每天的数据量是144条
在这里插入图片描述
处理后的数据形式
在这里插入图片描述

分析

  1. 去除表格中的q的异常值,置为0
  2. 去除重复行
  3. 将原始表格中的date分裂成日期和时间
  4. 缺失的时间点数据补0,否则无法将单列数据reshape成二维表的形式
  5. reshape df_empty.pivot

代码实现

# coding:utf-8
from tqdm import tqdm
import numpy as np
import pandas as pd

def compute_uniq_dates(df):
    uniq_dates = df['date'].unique()
    ## 取出一天的时间间隔 -- 时间点
    for uniq_date in uniq_dates:
        single_info = df[df['date'] == uniq_date]
        num_data = len(single_info)
        if num_data == 144:
            time_sep = single_info['time']
            break
    print('time_sep \n', time_sep)
    return uniq_dates,time_sep

def concate_dates(df,uniq_dates,time_sep):
    count = 0
    miss_date = [] ## 缺数据的日期
    ## 建立空表,拼接每天的结果
    df_empty = pd.DataFrame(columns=['date', 'time', 'q'])  ## 保存最后的结果
    ## 有哪些天有缺失数据,分别缺了过少条
    for uniq_date in tqdm(uniq_dates):
        single_info = df[df['date'] == uniq_date]
        num_data = len(single_info)
        ## 判断原始表格中这天的数据是否完整,不完整补齐,多了去掉
        ## 完整直接使用原始表格中的数据
        if num_data != 144:
            if num_data < 144:
                miss_date.append(uniq_date)
            else:  ## > 144条的
                print('duplicate uniq_date', uniq_date)

            count += 1
            ## temp_df 保存当天的数据。如果原始表格中有数据,用原始表格中数据;
            # 如果原始表格中没有数据,用0代替
            temp_df = {'date': pd.Series(np.array([uniq_date for i in range(len(time_sep))])),
                       'time': pd.Series(np.array(time_sep.tolist())),
                       'q': pd.Series(np.array([0. for i in range(len(time_sep))]))}  # 没有设置index的Series
            temp_df = pd.DataFrame(temp_df, columns=['date', 'time', 'q'])

            ## 不够的补齐数据
            for sample_time in time_sep:  ## 时间点 8:00
                try:
                    ## 取出原始表格中 当前日期和时间的q值,并赋值给新表格中相同日期和时间点
                    ## 如果原始表格中无法取出这个数据,说明这个数据丢失,使用temp_df在定义时的0代替
                    actual_val = single_info.loc[(single_info['date'] == uniq_date) & (single_info['time'] == sample_time), 'q'].values.tolist()[0]
                    temp_df.loc[(temp_df['date'] == uniq_date) & (temp_df['time'] == sample_time), 'q'] = float(actual_val)
                except:  ## 表示时间点不存在,维持0
                    continue
            ## 当原始数据中同一个时间点有两个数据,且数据不相等时,新表和旧表的同一天的q值的和不同
            ## 此部分用于找出原始数据中的问题数据
            if True:
                if int(single_info['q'].sum()) != int(temp_df['q'].sum()):
                    print(single_info['q'].sum())
                    print(temp_df['q'].sum())
                    print('uniq_date,sample_time unequal sum', uniq_date, sample_time)
                # exit()
            ## 一天天地去拼接数据
            df_empty = pd.concat([df_empty, temp_df], axis=0)
        else:
            df_empty = pd.concat([df_empty, single_info], axis=0)
    return df_empty,miss_date

def parse_df(df):
    print('processing ......')

    df['time'] = pd.to_datetime(df['date']).dt.time
    df['date'] = pd.to_datetime(df['date']).dt.date
    # 去除重复行
    df = df.drop_duplicates()

    ## 去掉异常值
    df_new = df[df['q'] > 10]
    df = df_new[df_new['q'] < 600]

    # # 使用duplicated()函数找出重复行
    # duplicate_rows = df[df.duplicated()]

    ## 采的数据日期和时间点
    uniq_dates, time_sep = compute_uniq_dates(df)
    df_empty,miss_date = concate_dates(df,uniq_dates,time_sep)

    print('df_empty\n', df_empty)
    # 重新排列表格成目标形式
    # df = df_empty.pivot(index='time', columns='date', values='q').fillna(0)
    df = df_empty.pivot(index='date', columns='time', values='q').fillna(0)
    # 重置索引
    df = df.reset_index()
    ## 保存结果
    df.to_csv('output.csv', index=False)
    fw = open('miss_date.txt', 'w')
    for da in miss_date:
        line = da.strftime('%Y-%m-%d') + '\n'
        fw.write(line)
    print('miss date', miss_date)
    exit()
if __name__ =='__main__':
    xlsx_path = 'temp.csv'
    df = pd.read_csv(xlsx_path, encoding='utf-8')
    parse_df(df)

遇到的问题

  1. 无法打开文件UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in position 2: invalid start byte
    解决办法:用记事本打开csv文件,更改编码方式是TUTF-8
  2. 如何取出原始表格中的日期和时间
df['time'] = pd.to_datetime(df['date']).dt.time
df['date'] = pd.to_datetime(df['date']).dt.date ## 覆盖原始的date
  1. 如何取出原始表格中指定日期和时间的q值,并更新到新表格中
    使用loc取出数据,原始数据中存在一个时间点多个数据,且数据不相同,无法用duplicate去掉,这里取的第一个值
# 取出原始表格中 当前日期和时间的q值,并赋值给新表格中相同日期和时间点
## 如果原始表格中无法取出这个数据,说明这个数据丢失,使用temp_df在定义时的0代替
actual_val = single_info.loc[(single_info['date'] == uniq_date) & (single_info['time'] == sample_time), 'q'].values.tolist()[0]
temp_df.loc[(temp_df['date'] == uniq_date) & (temp_df['time'] == sample_time), 'q'] = float(actual_val)
  1. 上述处理后,表格的形式为下面的这种形式,如何转成目标形式呢?
    在这里插入图片描述
# 重新排列表格成目标形式
## 时间-日期形式
# df = df_empty.pivot(index='time', columns='date', values='q').fillna(0)
## 日期-时间形式
df = df_empty.pivot(index='date', columns='time', values='q').fillna(0)
# 重置索引
df = df.reset_index()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1261982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新的外贸自建站教程?做外贸如何建网站?

外贸自建站教程步骤有哪些&#xff1f;海洋建站如何做网站搭建&#xff1f; 想要了解关于外贸自建站的最新教程吗&#xff1f;外贸自建站不再是高不可攀的难题&#xff0c;相反&#xff0c;它为企业提供了更多的机会和自主掌握业务的空间。海洋建站将为您提供一份全面的指南&a…

山寨Stream API设计分析

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 私以为&#xff0c;Jav…

多类场景、遍布各地,融云 IM 支撑多款应用全球增长

&#xff08;全网都在找的《社交泛娱乐出海作战地图》&#xff0c;点击获取&#x1f446;&#xff09; 无论是面向企业场景的工作流协同还是消费场景的网络效应形成&#xff0c;商务社交还是陌生人社交&#xff0c;IM 都是必备组件。IM 遍布互联网各角落&#xff0c;出现在所有…

超声波雪深监测站冬季雪景的智能守护者

随着冬季的到来&#xff0c;白雪皑皑的景象让人感到无比美丽。然而&#xff0c;雪景的美丽却给人们的生活和出行带来了一定的困扰。雪的深度和分布是影响道路交通、公共安全和旅游体验的关键因素。为了解决这一问题&#xff0c;WX-XS1 超声波雪深监测站在冬季应运而生&#xff…

Nvidia VPI 双目相机生成深度图

nVidia VPI&#xff08;Vision Programming Interface&#xff09;提供了多种后端&#xff0c;用于执行图像处理和计算机视觉操作。不同的后端针对不同的硬件和用例进行了优化。这些后端包括&#xff1a; 1. CPU: 这是最通用的后端&#xff0c;它运行在标准的中央处理器&#…

【2023CANN训练营第二季】——Ascend C自定义算子工程介绍及实验

一、自定义算子工程介绍与创建 自定义算子工程是一个包含用户编写的host侧和kerne|侧算子实现文件的&#xff0c;用于编译和安装自定义算子run包的工程框架。 CANN软件包中提供了工程创建工具msopgen&#xff0c;开发者可以输入算子原型定义文件生成Ascend C算子开发工程。 需…

AMP State Evolution的计算:以伯努利先验为例

AMP State Evolution (SE)的计算 t 1 t1 t1时&#xff0c; E ( t ) E [ X 2 ] \mathcal E^{(t)} \mathbb E [X^2] E(t)E[X2]&#xff0c;SE的迭代式为 τ r ( t ) σ 2 1 δ E ( t ) E ( t 1 ) E ∣ η ( t ) ( X Z ) − X ∣ 2 , Z ∼ N ( 0 , τ r ( t ) ) \begin{a…

盘点72个Android系统源码安卓爱好者不容错过

盘点72个Android系统源码安卓爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1qiWeLjF2i4dlgmTYgPPSvw?pwd8888 提取码&#xff1a;8888 项目名称 A keyboardlisten…

AIGC系列之:升级版的Stable Diffusion之SDXL介绍

目录 AIGC工具对比 DALL-E MidJourney Stable Diffusion 相关资料 SDXL介绍 SDXL生图效果 SDXL训练LoRA流程 AIGC工具对比 在目前的三大新兴文本转图像模型中&#xff0c;Stable Diffusion诞生得最晚&#xff0c;但由于拥有发展良好的开源社区&#xff0c;它的用户关注…

Linux系统安装Docker-根据官方教程教程(以Ubuntu为例)

Linux系统安装Docker-根据官方教程教程&#xff08;以Ubuntu为例&#xff09; 1. 背景介绍2. 环境配置2.1 软件环境要求2.2 软件下载2.3 文档地址2.3 必备命令工具下载 3. 安装Docker3.1 使用root用户操作后续命令3.2 卸载可能存在的旧版本 4. 安装Docker4.1 更新依赖包4.4 配置…

530. 二叉搜索树的最小绝对差 在java中,一个类里面的属性,直接定义在类下面和定义在该类的方法里,有什么区别

530. 二叉搜索树的最小绝对差 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;错误经验吸取在java中&#xff0c;一个类里面的属性&#xff0c;直接定义在类下面和定义在该类的方法里&#xff0c;有什么区别&#xff1f;&#xff1f;&…

webshell之反射免杀

主要讲解反射在webshell中的利用&#xff0c;以及反射绕过杀软的利用与原理 原始反射马 免杀效果: 特征太明显里面还有java.lang.Runtime&#xff0c;getRuntime&#xff0c;exec这些敏感内容&#xff0c;由于与反射相关的参数都是字符串&#xff0c;由此我们能操作的空间就很…

接口01-Java

接口-Java 一、引入(快速入门案例)二、接口介绍1、概念2、语法 三、应用场景四、接口使用注意事项五、练习题1 一、引入(快速入门案例) usb插槽就是现实中的接口。 你可以把手机、相机、u盘都插在usb插槽上&#xff0c;而不用担心那个插槽是专门插哪个的&#xff0c;原因是做u…

2023年【危险化学品经营单位安全管理人员】考试总结及危险化学品经营单位安全管理人员模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【危险化学品经营单位安全管理人员】考试总结及危险化学品经营单位安全管理人员模拟试题&#xff0c;包含危险化学品经营单位安全管理人员考试总结答案和解析及危险化学品经营单位安全管理人员模拟试题练习。安…

.NET6实现破解Modbus poll点表配置文件

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 Modbus 协议是工控领域常见…

jq+canvas:实现图片上传+裁剪+保存等功能

效果图 上传图片之前&#xff1a; 上传图片之后&#xff0c;点击放大/缩小后的效果&#xff1a; 裁剪之后的效果&#xff1a; 代码实现如下&#xff1a; 1.html部分 <input type"file" id"fileInput" accept"image/png, image/gif, image/j…

GDOUCTF2023-Reverse WP

文章目录 [GDOUCTF 2023]Check_Your_Luck[GDOUCTF 2023]Tea[GDOUCTF 2023]easy_pyc[GDOUCTF 2023]doublegame[GDOUCTF 2023]L&#xff01;s&#xff01;[GDOUCTF 2023]润&#xff01;附 [GDOUCTF 2023]Check_Your_Luck 根据 if 使用z3约束求解器。 EXP&#xff1a; from z3 i…

OkHttp的配置

一、拦截器 1.添加拦截器的作用&#xff1a; 每次在请求过程中就会回调一次intercept方法 2.拦截器的回调方法里我们可以做那些事情&#xff1a; 当前的请求还没有发给服务器&#xff0c;比如我们在与服务器通信的时候&#xff0c;一个应用中很多地方都会跟服务器发起通信。…

WGS84转CGCS2000操作步骤

1、使用一个转换软件实现不同椭球之间转换七参数的求取。打开坐标转换软件如下&#xff1a; 2、点击设置-地图投影&#xff0c; 如下&#xff1a; 3、设置需要投影到的坐标系&#xff0c;如下&#xff1a; 4、【选择目标坐标系】中选择CGCS2000&#xff0c;如下&#xff1a; 5、…

智能优化算法应用:基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.正余弦算法4.实验参数设定5.算法结果6.参考文献7.…