格式转化和时间类型
实用场景:拿到一份数据,或者在数据处理过程中,我们有时会简单对数据做一点简单变换,也就是数据预处理。
学习目标1
数据预处理,通常包括数据类型的转换、和index的转换。今天将学习:
1. 时间类型数据
2. 字符转时间函数
3. 时间转字符函数
4. 格式转换函数
时间数据在很多领域都是重要的结构化数据形式。时间的运算,有自己的逻辑和规则,和现有的字符串、整型、浮点型的逻辑不一样。在Python中,时间数据可能有下面三种形式:
1. 具体的时间点,比如2020/09/30 12:00:00
2. 时间间隔,比如3 days,2 months,是两个时间点之间的差值。
3. 时期,比如2020年9月,代表了9月1日-30日一整个月。
也对应了三种时间类型,datetime类型、timedelta类型、period类型。
我们尝试构建一个如图的DataFrame,来描述三名同学入学和毕业时间。 |
倘若我们想要自己构造一个时间类型的数据,就必需引入 |
datetime
模块
导入datetime
模块,使用datetime()
函数,实现了时间类型数据的构造。
|
构造变量start是2020年5月1日,end是2020年10月1日。 |
除了datetime和timedelta外,还有一个表示时间区间的类型"period"。
这个时间类型,表达的是一个时间段。
"period"的实际应用比较少,而且通常用后续学习的时间转字符函数代替,因此,在这里就简单展开了。
Period 在数据分析中的应用
在时间序列数据中,Period
可以用来对数据进行分组、聚合或重采样。例如,对于月度数据,可以将其按季度或年度聚合:
# 创建示例数据 date_range = pd.date_range('2024-01-01', periods=6, freq='M') data = pd.Series([10, 20, 30, 40, 50, 60], index=date_range) # 将数据的时间戳转换为季度周期,并按季度聚合 data_quarter = data.to_period('Q').groupby(level=0).sum() print(data_quarter) |
输出结果将显示按季度聚合后的数据。
Period的实际应用场景
- 财务数据分析:按季度、年度等周期汇总数据。
- 销售数据分析:对销售记录按时间段进行统计,如每月、每年。
- 时间序列数据重采样:将更高频率的时间数据重采样到较低频率,如将每日数据转换为每月数据,并进行聚合。
刚刚学习了基本的时间类型,和如何自己构造一个时间类型的数据。
在实际应用中,更多时候,我们从文件中读取数据,存放在CSV、Excel文件中的时间,都是字符串型数据。如果我们要对其进行时间类型的处理,就要批量将DataFrame中的数据,转为datetime类型。
这就会用到pandas模块中的to_datetime()函数。
我们读取"电商订单数据.csv",只取了其中的两列 "create_time"和"pay_time"。
此时,这两列是字符串类型。接下来,我们使用to_datetime()函数,将其转化为时间类型。
第5、6行,使用to_datetime()函数,将字符串格式的时间数据,转化为时间格式。 此时,输出结果为datetime类型。 |
字符串转时间
第8、9行,使用to_datetime( )函数,将字符串格式的时间数据,转化为时间格式。 此时,输出结果为datetime类型。 |
# 导入pandas模块,简称为pd 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) |
代码具体解释:
需要转化的列 使用列索引,将需要转化格式的列选出来,作为参数。 在这里,"create_time"和"pay_time"这两列需要转换格式,因此将其传入作为参数。 |
# 导入pandas模块,简称为pd 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) |
函数pd.to_datetime pd.to_datetime( )函数,将参数中这一列的数据,转化成时间格式。 |
# 导入pandas模块,简称为pd 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) |
赋值的新列 转化成时间格式之后,赋值给新的一列。 |
# 导入pandas模块,简称为pd 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行代码中,使用 |
简单来说,对于时间类型数据的处理需要先通过后缀.dt进行转化,再进行其他操作。 如图: 使用df["pay_time"].dt.day 获取"pay_time" 这列数据的日。 使用df["pay_time"].dt.month获取"pay_time" 这列数据的月。 |
数据处理中,会将字符串转为时间类型,进行时间的计算。有时,也会将时间类型数据,按照指定的格式,转为字符串数据。
这时,会涉及到.dt和strftime()函数。
读取文件并且使用to_datetime()将create_time和pay_time转化为时间类型。 输出是精确到“秒”的时间类型。 在后续应用中,我们在分组或者可视化的时候,常会需要年月日这样的字符串型的日期。 就会需要用到strftime()函数,将时间类型,转化为指定格式的字符串类型。 |
代码 import pandas as pd df= pd.read_csv("/Users/time/电商数据.csv",usecols=[9,10] df["pay_time"]= pd.to_datetime(df["pay_time"]) print(df) 运行结果 pay time 1 2018-01-31 16:06:00 2 2018-01-31 16:13:00 3 2018-01-31 23:52:00 …… 85649 2018-07-20 15:33:00 85650 2018-07-20 15:35:00 85651 2018-07-20 15:43:00 |
时间转字符串
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) |