数据预处理,通常包括数据类型的转换、和index的转换。今天将学习:
1. 时间类型数据
2. 字符转时间函数
3. 时间转字符函数
4. 格式转换函数
一、时间类型数据
时间数据在很多领域都是重要的结构化数据形式。时间的运算,有自己的逻辑和规则,和现有的字符串、整型、浮点型的逻辑不一样。
在Python中,时间数据可能有下面三种形式:
1. 具体的时间点,比如2020/09/30 12:00:00
2. 时间间隔,比如3 days,2 months,是两个时间点之间的差值。
3. 时期,比如2024年4月,代表了4月1日-30日一整个月。
也对应了三种时间类型,datetime
类型、timedelta
类型、period
类型。
1.1 datetime类型
datetime
类型是Python标准库中 datetime
模块的一部分。它用于表示一个具体的日期和时间点。datetime
对象包含年、月、日、时、分、秒和微秒等属性。可以使用这个类型进行日期的算术运算、比较、格式化等操作。
eg1:
from datetime import datetime
# 创建一个datetime对象
now = datetime.now()
print(now) # 输出当前日期和时间
2024-04-15 06:32:33.883869
eg2:
from datetime import datetime
start = datetime(2024, 5, 1, 23, 59, 59)
end = datetime(2024,10, 1)
timeSpan = end - start
print(timeSpan)
print(type(timeSpan))
152 days, 0:00:01
<class 'datetime.timedelta'>
1.2 timedelta类型
timedelta
也是Python标准库中 datetime
模块的一部分。它表示两个日期或时间之间的差异。你可以使用这个类型来进行日期的加减运算。
from datetime import timedelta
# 创建一个表示10天的timedelta对象
delta = timedelta(days=10)
# 使用timedelta对象
new_date = now + delta
print(new_date) # 输出10天后的日期和时间
2024-04-25 06:32:33.883869
1.3 period类型
Period
并不是Python标准库的一部分,而是Pandas库中的一个类型。Pandas是一个流行的数据分析库,Period
表示一个时间区间,通常用于时间序列分析。与 datetime
对象表示的某个具体时间点不同,Period
表示的是一个时间范围。
import pandas as pd
# 创建一个表示2023年1月的Period对象
period = pd.Period('2023-01', freq='M')
print(period) # 输出:Period('2023-01', 'M')
2023-01
总的来说:
datetime
表示一个具体的时间点。timedelta
表示时间上的差异,用于日期的算术运算。Period
(Pandas中)表示一个时间段,常用于时间序列数据的分析。
二、 字符转时间函数
2.1 to_datetime( )
函数
在Python中,to_datetime()
函数通常与 Pandas 库相关,它是一个非常方便的工具,用于将参数转换为 Pandas 的 Timestamp
对象,这些对象在 Pandas 内部用于表示日期和时间。to_datetime()
可以处理多种格式的输入,包括字符串、数字和其他 Pandas 数据类型,如 Series
。
eg1:对文件中的“字符串时间操作”:
# 导入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)
eg2:
import pandas as pd
# 从字符串转换
date_string = "2024-04-15"
timestamp = pd.to_datetime(date_string)
print(timestamp)
# 从一个包含日期字符串的 Pandas Series 转换
date_series = pd.Series(['2024-04-15', '2024-04-16', '2024-04-17'])
timestamp_series = pd.to_datetime(date_series)
print(timestamp_series)
# 还可以处理不同的日期格式
different_format_series = pd.Series(['15/04/2024', '16/04/2024', '17/04/2024'])
timestamp_series_formatted = pd.to_datetime(different_format_series, format='%d/%m/%Y')
print(timestamp_series_formatted)
# 还可以处理 UNIX 时间戳(单位为秒)
unix_timestamps = pd.Series([1681574400, 1681660800, 1681747200])
datetime_series = pd.to_datetime(unix_timestamps, unit='s')
print(datetime_series)
2023-04-15 00:00:00
0 2023-04-15
1 2023-04-16
2 2023-04-17
dtype: datetime64[ns]
0 2023-04-15
1 2023-04-16
2 2023-04-17
dtype: datetime64[ns]
0 2023-04-15 16:00:00
1 2023-04-16 16:00:00
2 2023-04-17 16:00:00
dtype: datetime64[ns]
2.2 strptime
函数
在Python中,将字符串转换为时间对象通常使用datetime
模块中的strptime
函数。strptime
函数可以将一个字符串按照指定的格式解析成一个datetime
对象,这个对象表示一个具体的日期和时间。
from datetime import datetime
# 定义日期时间字符串
date_string = "2024-04-01 12:35:45"
# 定义解析字符串的格式
format_string = "%Y-%m-%d %H:%M:%S"
# 使用strptime函数将字符串转换为datetime对象
date_object = datetime.strptime(date_string, format_string)
print(date_object) # 输出转换后的datetime对象
2024-04-01 12:35:45
strptime
函数按照format_string
指定的格式来解析date_string
,并返回一个datetime
对象。
格式字符串中的指令如下:
%Y
:四位数的年份(例如:2024)%m
:两位数的月份(01到12)%d
:两位数的日期(01到31)%H
:两位数的小时(00到23)%M
:两位数的分钟(00到59)%S
:两位数的秒(00到59)- %W 一年的第几个星期,以周一为星期的开始
- %u 星期几,如7代表星期日
三. 时间转字符函数
3.1 strftime函数
在Python中,将时间类型转换为字符串类型通常使用datetime
对象的strftime
方法。
strftime
是“string format time”的缩写,它允许你按照指定的格式将datetime
对象转换为字符串。
在实际应用中,如果我们只需要获取时间类型数据的年、月、日。首先,可以通过后缀.dt
可以把时间类型的数据转成一种方便我们提取日期或时间的对象。这种对象包含多种属性,其中就有 year(年)、month(月)、day(日)等。
eg1:
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)
create_time pay_time
0 2018-01 2018-01
1 2018-01 2018-01
2 2018-01 2018-01
... ... ...
85649 2018-07 2018-07
85650 2018-07 2018-07
85651 2018-07 2018-07
注意:只有在Series和DataFrame中,列索引筛选的数据进行格式转换时,才需要.dt
。
eg2:
from datetime import datetime
# 创建一个datetime对象
now = datetime.now()
# 使用strftime方法将datetime对象转换为字符串
# %Y 代表四位年份,%m 代表两位月份,%d 代表两位日期,
# %H 代表小时,%M 代表分钟,%S 代表秒
formatted_string = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_string) # 输出格式为:YYYY-MM-DD HH:MM:SS
# 你还可以使用其他格式代码来定制输出
date_only_string = now.strftime("%Y-%m-%d")
print(date_only_string) # 输出格式为:YYYY-MM-DD
time_only_string = now.strftime("%H:%M:%S")
print(time_only_string) # 输出格式为:HH:MM:SS
# 更多的格式化选项
custom_formatted_string = now.strftime("Date: %A, %B %d, %Y | Time: %I:%M %p")
print(custom_formatted_string) # 输出可能类似于:Date: Monday, April 04, 2023 | Time: 05:30 PM
2024-04-15 07:16:29
2024-04-15
07:16:29
Date: Monday, April 15, 2024 | Time: 07:16 AM
在strftime
方法中,你可以使用各种格式代码来定制输出的字符串格式。这些格式代码以百分号(%
)开头,后面跟着一个特定的字符,用于表示日期和时间的不同部分。例如,%Y
代表四位数的年份,%m
代表月份,%d
代表日期,等等。
除了datetime
对象的strftime
方法外,如果你正在使用Pandas库中的Timestamp
对象,你也可以使用相同的方法将其转换为字符串,因为Pandas的Timestamp
对象继承自Python的datetime
对象。
import pandas as pd
# 创建一个Pandas Timestamp对象
timestamp = pd.Timestamp('2023-04-01 12:35:45')
# 使用strftime方法将Timestamp对象转换为字符串
formatted_string = timestamp.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_string) # 输出格式为:YYYY-MM-DD HH:MM:SS
2023-04-01 12:35:45
3.2 时间戳的概念
时间戳是一个用于标识特定事件发生时间的数字或编码信息的序列。它通常表示从某一固定时间点(如1970年1月1日00:00:00 GMT,也被称为UNIX纪元或UNIX Epoch)到当前时间的总秒数,以格林威治时间(GMT)为基准。这个时间点被广泛认为是计算机系统中最早的可表示时间点,因此时间戳通常是从这个时间点开始计算的。
时间戳的主要作用是记录时间,它可以用于多种场景,如网站的访问日志、数据库的操作记录、文件的版本控制等。通过时间戳,我们可以方便地对事件进行排序、查询和比较,从而更好地管理和分析数据。时间戳不仅以秒为单位,还可以使用毫秒、微秒等更小的时间单位,以满足不同场景下的精度需求。在某些需要极高精确度的场景下,如高频交易系统或科学实验中,甚至可能需要使用纳秒级别的时间戳。
此外,时间戳可以用不同的方式表示,如整数、浮点数、字符串等,具体表示方式可能因不同的编程语言和操作系统而异。例如,在Unix/Linux系统中,时间戳通常是一个整数,表示从UNIX纪元开始的秒数;而在其他系统中可能有不同的表示方法。
时间戳的应用不仅限于计算机科学领域,它还广泛应用于其他需要精确记录时间的场景,如金融交易、物流追踪、科学实验等。通过时间戳,我们可以确保数据的时效性和准确性,从而更好地理解和分析事件的发生顺序和持续时间。
3.3 时间戳的应用
时间戳在Python中有多种应用,主要体现在以下几个方面:
-
日志记录:
通过在日志文件中包含时间戳,可以轻松地追踪和理解系统或应用程序在何时发生了什么事情。 -
性能分析:
通过记录关键代码段执行前后的时间戳,可以计算出这些代码段的执行时间,从而进行性能分析和优化。 -
缓存机制:
在构建缓存系统时,时间戳可以用来判断缓存数据的新鲜度。通过比较缓存项的时间戳和当前时间,可以确定缓存是否过期,从而决定是否需要更新缓存。 -
任务调度:
对于需要定时执行的任务,可以使用时间戳来设置任务的开始时间、结束时间或执行周期。Python中的任务调度库(如APScheduler)就广泛使用了时间戳来管理任务的调度。 -
数据同步:
在分布式系统中,时间戳可以帮助同步不同节点之间的数据。通过比较数据项的时间戳,可以确定哪些数据是最新的,从而避免数据冲突和不一致性。 -
安全性验证:
在网络安全领域,时间戳可以用于验证消息的时效性和完整性。例如,在数字签名中,时间戳可以作为签名的一部分,以确保消息在特定时间内是有效的。 -
数据处理与分析:
在处理时间序列数据时,时间戳是不可或缺的一部分。它可以帮助我们理解数据点之间的时间关系,从而进行更准确的数据分析和预测。 -
API请求限制:
在构建API服务时,可以使用时间戳来限制用户在特定时间内的请求频率,以防止API被滥用。
在Python中,你可以使用time
模块或datetime
模块来获取和操作时间戳。例如,time.time()
函数会返回当前时间的时间戳(自1970年1月1日以来的秒数)。这个时间戳可以用于上述的各种应用场景中。
四、格式转换函数
上图反映了格式转换的关系,下面重点介绍astype()函数。
4.1 astype函数
astype()
函数是Python中Pandas库和NumPy库的一个重要方法,用于将数据的类型转换为指定的数据类型。这个函数非常灵活,可以用于转换整个DataFrame、Series或者NumPy数组的数据类型。
在Pandas中,astype()
函数的基本语法如下:
DataFrame.astype(dtype, copy=True, errors='raise')
对于Series:
Series.astype(dtype, copy=True, errors='raise')
参数说明:
dtype
:要转换的数据类型,可以是Python内置的数据类型,也可以是NumPy的数据类型。例如,'int32'
,'float64'
,'str'
等。copy
:默认为True,表示是否创建一个数据的副本。如果设置为False,则可能会修改原始数据。通常建议保持为True,以避免对原始数据的意外修改。errors
:默认为'raise',表示在转换过程中遇到错误时的处理方式。可以选择'raise'抛出异常,或者选择'ignore'忽略错误(但这可能会导致数据丢失或不准确),还可以选择'coerce'将无法转换的值设置为NaN(对于数值类型)或NaT(对于日期和时间类型)。
eg1:
import pandas as pd
data = {"a":[1.134,2.12,3.54,0.23],"b":[1,2,3,0]}
df = pd.DataFrame(data)
df["b"] = df["b"].astype(float)
a b
0 1.134 1.0
1 2.120 2.0
2 3.540 3.0
3 0.230 0.0
eg2:
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])
0 False
1 True
2 False
3 True
dtype: bool
a b
1 2.12 2.0
3 0.23 0.0
4.2astype函数的注意事项
- 在进行类型转换之前,最好先了解数据的范围和特点,以确保转换是合理的。例如,将浮点数转换为整数时,小数部分会被截断。
- 对于大型数据集,类型转换可能会占用相当多的计算资源和时间。
- 当使用
errors='coerce'
选项时,需要特别注意处理转换后产生的NaN值,以避免在后续的数据分析或建模中引入错误。