Python数据分析基础学习笔记(?)--数据格式转换以及时间类型(百职帮自用)

本文介绍了在Python中处理时间类型数据的关键概念,包括如何构造datetime对象、使用to_datetime和astype进行字符串转时间格式,以及如何通过.pdt属性和strftime函数进行日期提取和格式转换。着重讲解了pandas库在数据预处理中的应用。
摘要由CSDN通过智能技术生成

不要关注我,不要关注我,不要关注我

1. 时间类型数据

时间数据在很多领域都是重要的结构化数据形式。

时间的运算,有自己的逻辑和规则,和现有的字符串、整型、浮点型的逻辑不一样。

我们尝试构建一个如图的DataFrame,来描述三名同学入学和毕业时间。

在构造时,我们是以字符串格式,将时间数据存入。

但由于是字符串格式,我们无法对时间进行运算。

倘若我们想要自己构造一个时间类型的数据,就必需引入datetime模块中的datetime数据类型,这是Python自带的模块。

在Python中,时间数据可能有下面三种形式:

1. 1具体的时间点,比如2020/09/30 12:00:00

示例代码中,通过导入datetime模块,使用datetime()函数,实现了时间类型数据的构造。

datetime()函数内,需要按照年、月、日、时、分、秒依次传入数字,组成一个时间。至少需要传入年、月、日的参数。

比如,start传入了年月日时分秒的数据构造时间,end只传入了年月日的数据构造时间。

from datetime import datetime

start = datetime(2020, 5, 1, 23, 59, 59)
end = datetime(2020, 10, 1)

print(start)
print(end)
print(type(start))

1.2 时间间隔,比如3 days,2 months,是两个时间点之间的差值。

构造变量start是2020年5月1日,end是2020年10月1日。

因为start和end均为时间类型数据,因此可以直接进行运算,将结果赋值给timeSpan。

timeSpan的输出结果,就是end比start多出来的时间,精确到秒。并且数据类型是timedelta,这也就是时间间隔。

from datetime import datetime

start = datetime(2020, 5, 1, 23, 59, 59)
end = datetime(2020, 10, 1)

timeSpan = end - start

print(timeSpan)
print(type(timeSpan))

1.3 时期,比如2020年9月,代表了9月1日-30日一整个月。

也对应了三种时间类型,datetime类型、timedelta类型、period类型。

2. 字符转时间函数

刚刚学习了基本的时间类型,和如何自己构造一个时间类型的数据。

更多时候,我们从文件中读取数据,存放在CSV、Excel文件中的时间,都是字符串型数据。

如果我们要对其进行时间类型的处理,就要批量将DataFrame中的数据,转为datetime类型。

这就会用到pandas模块中的to_datetime()函数。

我们读取"电商订单数据.csv",只取了其中的两列 "create_time"和"pay_time"。

此时,这两列是字符串类型。接下来,我们使用to_datetime()函数,将其转化为时间类型。

转化成时间格式之后,赋值给新的一列。
在这里,这两列的数据,转化成时间格式后,重新赋值给这两列,也就是覆盖了原先的数据。

import pandas as pd

# 读取文件,赋值给变量df
df= pd.read_csv("/Users/time/电商数据.csv", usecols=[9,10])

# 使用to_datetime()函数,将create_time和pay _time转化成时间格式
df["create_time"] = pd.to_datetime(df["create_time"])
df["pay_time"] = pd.to_datetime(df["pay_time"])

# 输出此时的df
print(df)

在实际应用中,如果我们只需要获取时间类型数据的年、月、日。

首先,可以通过后缀.dt可以把时间类型的数据转成一种方便我们提取日期或时间的对象。

这种对象包含多种属性,其中就有 year(年)、month(月)、day(日)等。

第7行代码中,使用df["pay_time"].dt.year获取 "pay_time" 这列数据的年的信息。

简单来说,对于时间类型数据的处理需要先通过后缀.dt进行转化,再进行其他操作。

注意:.dt不能直接使用在单独的时间类型上

如图:

使用df["pay_time"].dt.day 获取"pay_time" 这列数据的日。

使用df["pay_time"].dt.month获取"pay_time" 这列数据的月。

3. 时间转字符函数

数据处理中,会将字符串转为时间类型,进行时间的计算。

有时,也会将时间类型数据,按照指定的格式,转为字符串数据。

这时,会涉及到.dtstrftime()函数。

在后续应用中,我们在分组或者可视化的时候,常会需要年月日这样的字符串型的日期。

就会需要用到strftime()函数,将时间类型,转化为指定格式的字符串类型。

import pandas as pd

df= pd.read_csv("/Users/time/电商数据.csv", usecols=[9,10])

df["create_time"] = pd.to_datetime(df["create_time"])
df["pay_time"] = pd.to_datetime(df["pay_time"])

df["create_time"] = df["create_time"].dt.strftime("%Y-%m")
df["pay_time"] = df["pay_time"].dt.strftime("%Y-%m")

print(df)

datetime类型的数据要先通过后缀.dt转化。

只有在Series和DataFrame中,列索引筛选的数据进行格式转换时,才需要.dt

strftime()函数内的时间格式化符号,可以理解为是一种格式化输出。

%Y代表时间的年,%m代表时间的月,%d代表时间的日。时间以外的其他的内容可以任意编辑。

如图举了两个例子:

%Y-%m-%d,就是2018-01-31。

%Y年%m月,就是2018年01月。

格式化字符,不止"%Y", "%m", "%d"。
右图列出了最常用到的8个格式化字符。使用时,可以据此进行查询。
有一个非常易混的地方:"%m"代表月,"%M"代表分钟。

4. 格式转换函数

to_datetime()函数和strftime()函数,能实现字符串格式和时间格式之间的相互转换。

整型、浮点型、字符串、布尔型在满足一定条件时,也能进行相互之间的转换,这是通过astype()函数来实现的。
 

4.1转化为字符串类型(str)数据:

astype(str)

整型、浮点型数据,可以直接使用.astype(str)函数。将数据类型转化为字符串类型。

转化为字符串类型,是数据处理中常会用到的操作。

比如电话号码,身份证号等纯数值的数据,通常是不可变的,需要将其作为字符串处理。

读取"信用卡用户信息.csv"的文件,手机号phone_number这一列在读取时,是整型的数据类型。

我们尝试使用astype()函数,将其转化为字符串类型。

# 导入模块
import pandas as pd

# 读取文件
df = pd.read_csv("/Users/find/信用卡用户信息.csv")

# 输出phone_number这一列的数据类型
print(df["phone_number"].dtype)

# TODO 使用astype(),将phone_number这一列转化为字符串类型,重新赋值给phone_number这一列
df["phone_number"] = df["phone_number"].astype(str)

# 再输出phone_number这一列现在的数据类型
print(df["phone_number"].dtype)

4.2转化为整型(int)数据:

浮点型数据,可以直接使用.astype(int)函数,使用后数据将只保留整数部分。

字符串数据,仅有当数据是整数数字时,才能使用.astype(int)函数,否则将会报错。

转化为整型,在实际处理中用到的不多。

4.3转化为浮点型(float)数据:

字符串数据,当数据是数字(整数,小数都可以)时,可以使用.astype(float)函数,否则将会报错。

整型数据,可以直接使用.astype(float)函数,使用后数据将用0补充为一位小数。

转化为浮点型,在实际处理中用到的不多。

4.4转化为布尔型数据:

astype(bool)

整型、浮点型数据,可以直接使用.astype(bool)函数。

如果数据是整型0、浮点型0.0,则会转化为布尔值False;如果数据是非0,则会转化为布尔值True。

转化为布尔型,也是一个数据处理中常会用到的操作。

在计算机的储存中,许多是用1/0变量,来代表True/False。

在pandas中,就可以通过astype()函数,将1/0转化为布尔型的True/False。

我们来尝试简单操作一下,来通过布尔索引 来进行筛选。

# 导入模块
import pandas as pd

# 定义一个字典
data = {"rank":[1,2,3,4],"GDP":[80855,77388,68024,47251]}

# 构造一个DataFrame
df = pd.DataFrame(data)

# 定义一个01组成的列表
search = [0,1,0,1]

# 构造成一个Series
se = pd.Series(search)

# TODO 使用astype函数,将se中的01,转换为False/True的se,重新赋值给se
se = se.astype(bool)

# 输出此时se
print(se)

# 用布尔索引筛选,输出筛选结果
print(df[se])

补充:

循环遍历Series


在pandas模块中,我们可以使用for循环,访问到Series中的每一个值。
例如,循环遍历data变量中,"身份证号"这一列数据的代码为:

for idNo in data["身份证号"]:
    print(idNo)

输出为:
532822198104013
652826199304066
140428198101265
......

字符串转整型
 

Python的内置函数int(),可以将一个字符串转换为整型。只需将字符串作为参数传入该函数中即可。

例如,将刚刚获取到的idNo转换为整型的代码如下:

int(idNo)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值