python格式转换与时间类型

        数据预处理,通常包括数据类型的转换、和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中有多种应用,主要体现在以下几个方面:

  1. 日志记录
    通过在日志文件中包含时间戳,可以轻松地追踪和理解系统或应用程序在何时发生了什么事情。

  2. 性能分析
    通过记录关键代码段执行前后的时间戳,可以计算出这些代码段的执行时间,从而进行性能分析和优化。

  3. 缓存机制
    在构建缓存系统时,时间戳可以用来判断缓存数据的新鲜度。通过比较缓存项的时间戳和当前时间,可以确定缓存是否过期,从而决定是否需要更新缓存。

  4. 任务调度
    对于需要定时执行的任务,可以使用时间戳来设置任务的开始时间、结束时间或执行周期。Python中的任务调度库(如APScheduler)就广泛使用了时间戳来管理任务的调度。

  5. 数据同步
    在分布式系统中,时间戳可以帮助同步不同节点之间的数据。通过比较数据项的时间戳,可以确定哪些数据是最新的,从而避免数据冲突和不一致性。

  6. 安全性验证
    在网络安全领域,时间戳可以用于验证消息的时效性和完整性。例如,在数字签名中,时间戳可以作为签名的一部分,以确保消息在特定时间内是有效的。

  7. 数据处理与分析
    在处理时间序列数据时,时间戳是不可或缺的一部分。它可以帮助我们理解数据点之间的时间关系,从而进行更准确的数据分析和预测。

  8. API请求限制
    在构建API服务时,可以使用时间戳来限制用户在特定时间内的请求频率,以防止API被滥用。

在Python中,你可以使用time模块或datetime模块来获取和操作时间戳。例如,time.time()函数会返回当前时间的时间戳(自1970年1月1日以来的秒数)。这个时间戳可以用于上述的各种应用场景中。

四、格式转换函数

        上图反映了格式转换的关系,下面重点介绍astype()函数。

4.1 astype函数

   astype()函数是Python中Pandas库和NumPy库的一个重要方法,用于将数据的类型转换为指定的数据类型。这个函数非常灵活,可以用于转换整个DataFrameSeries或者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值,以避免在后续的数据分析或建模中引入错误。
  • 32
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值