【数据分析】格式转化和时间类型1

发布于:2025-03-24 ⋅ 阅读:(29) ⋅ 点赞:(0)

格式转化和时间类型

实用场景:拿到一份数据,或者在数据处理过程中,我们有时会简单对数据做一点简单变换,也就是数据预处理。

学习目标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数据类型,这是Python自带的模块。

datetime模块

导入datetime模块,使用datetime()函数,实现了时间类型数据的构造。

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

构造变量start是2020年5月1日,end是2020年10月1日。
因为start和end均为时间类型数据,因此可以直接进行运算,将结果赋值给timeSpan。
timeSpan的输出结果,就是end比start多出来的时间,精确到秒。并且数据类型是timedelta,这也就是时间间隔

除了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行代码中,使用df["pay_time"].dt.year获取 "pay_time" 这列数据的年的信息。

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

如图:

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

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

数据处理中,会将字符串转为时间类型,进行时间的计算。有时,也会将时间类型数据,按照指定的格式,转为字符串数据。

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

读取文件并且使用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")

//上文,使用.dt.strftime("%Y-%m")。将某一列时间类型数据,转换为字符串类型,并变成“年-月”的格式。

print(df)