不要关注我,不要关注我,不要关注我
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. 时间转字符函数
数据处理中,会将字符串转为时间类型,进行时间的计算。
有时,也会将时间类型数据,按照指定的格式,转为字符串数据。
这时,会涉及到.dt
和strftime()
函数。
在后续应用中,我们在分组或者可视化的时候,常会需要年月日这样的字符串型的日期。
就会需要用到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)