pandas(八)--实战一下

背景

收到一批数据,数据形式。采集数据的间隔时间是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 pddef 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']breakprint('time_sep \n', time_sep)return uniq_dates,time_sepdef concate_dates(df,uniq_dates,time_sep):count = 0miss_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的Seriestemp_df = pd.DataFrame(temp_df, columns=['date', 'time', 'q'])## 不够的补齐数据for sample_time in time_sep:  ## 时间点 8:00try:## 取出原始表格中 当前日期和时间的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:  ## 表示时间点不存在,维持0continue## 当原始数据中同一个时间点有两个数据,且数据不相等时,新表和旧表的同一天的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_datedef parse_df(df,save_path):print('processing ......')df['time'] = pd.to_datetime(df['date']).dt.timedf['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(save_path, 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__':csv_path = 'temp.csv'save_path = 'output.csv'df = pd.read_csv(csv_path, encoding='utf-8')parse_df(df,save_path)

遇到的问题

  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.hqwc.cn/news/226474.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【功能测试】软件系统测试报告

1.引言 1.1.目的 本测试报告为 xxx 系统测试报告&#xff0c;本报告目的在于总结测试阶段的测试及测试结果分析&#xff0c;描述系统是否达到需求的目的。 本报告预期参考人员包括测试人员、测试部门经理、开发人员、项目管理人员等。 1.2.参考文档 《xxxx系统需求规格说明…

leetcode LCR24反转单链表

反转单链表 题目描述 题目分析 先来说迭代的思想&#xff1a; 上面next cur->next应该放在cur->next pre前面执行&#xff0c;这里笔误 再来说递归的思想&#xff1a; 题目代码 这个代码里面我加了我自己写的测试数据&#xff0c;自己可以去找对应的部分&#xff0c…

【Linux】Linux第一个小程序 --- 进度条

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和Linux还有算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 …

C++STL库常用详解与原理

CSTL库 学习方法&#xff1a;使用STL的三个境界&#xff1a;能用&#xff0c;明理&#xff0c;能扩展。 常用库 库名称所需头文件数据结构string#include<string>串vector#include<vector>动态数组list#include<list>带头双向循环链表queue#include<queu…

14.Tomcat和HTTP协议-[一篇通]

文章目录 1.HTTP 协议1.1HTTP 是什么1.2理解 "应用层协议"1.3理解 HTTP 协议的工作过程1.4HTTP 协议格式1.4.1抓包工具的使用(Fiddler)1.4.2抓包工具的原理1.4.3抓包结果1.4.4协议格式总结 1.5HTTP 请求 (Request)1.5.1认识 URL1.5.1.1URL 基本格式1.5.1.2关于 URL e…

小程序如何进行一键修复

在使用小程序过程中&#xff0c;难免会遇到一些问题&#xff0c;比如程序崩溃、功能异常等等。这时&#xff0c;版本一键修复就显得尤为重要了。下面&#xff0c;我们就来介绍一下小程序如何进行版本一键修复。 一、什么是版本一键修复&#xff1f; 版本一键修复是指在小程序…

算法训练 第九周

一、移动零 1.双指针 我们可以设定两个指针i和j&#xff0c;其中i用来遍历整个数组&#xff0c;j用来遍历存放不为零的数的位置&#xff0c;当nums[i]不等于零时&#xff0c;就让nums[i]和nums[j]进行交换&#xff0c;然后j,当我们遍历完整个数组之后就完成了操作&#xff0c;…

【数据库】基于散列的两趟算法原理,以及集合与包的并,差,交,连接操作实现原理,执行代价以及优化

基于散列的两趟算法 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

shiro整合redis

shiro整合redis 前言&#xff1a;shiro默认的session是存储在jvm内存中的&#xff0c;这样会导致java服务内存占用更大以及一旦服务器宕机或者版本迭代需要重启服务时&#xff0c;缓存中的数据不能恢复&#xff0c;导致用户需要重新登录认证&#xff0c;体验很差。因此利用第三…

JavaScript 表达式

JavaScript 表达式 目录 JavaScript 表达式 一、赋值表达式 二、算术表达式 三、布尔表达式 四、字符串表达式 表达式是一个语句的集合&#xff0c;计算结果是个单一值。 在JavaScript中&#xff0c;常见的表达式有4种&#xff1a; &#xff08;1&#xff09;赋值表达式…

CopyOnWriteArrayList源码解析

CopyOnWriteArrayList源码解析 文章目录 CopyOnWriteArrayList源码解析一、CopyOnWriteArrayList二、总结 一、CopyOnWriteArrayList 在 JUC 中&#xff0c;对于 ArrayList 的线程安全用法&#xff0c;比较推崇于使用 CopyOnWriteArrayList &#xff0c;那么CopyOnWriteArrayL…