python 中的datetime, time(笔记向)
首先需要说明的是,excel会对日期和时间进行自己的处理,在excel中将日期格式转换成数值格式,会出现整数,对时间转换成数值格式会出现小数,这不是本文讨论的重点。
python中的 time 类在excel中是没有对应的格式名称的,即time对象通过pandas的to_excel写到excel中并不能直接转换成下图中的日期和时间
那么这会导致什么问题呢?
Q1: 世界上到底存不存在24:00:00?
A1: 我认为不存在!excel和pandas也是这么设计的,他们都在时间格式或者 time 类的设计中将24:00:00进行了转换,但是他们的转换结果是不一样的,
在excel的单元格中输入
,然后设置其单元格格式为时间,那么将会显示成0:00:00
在pandas中,读取这个单元格,在转换成time类型,将会成为timedelta(days=1),
Q2: 在excel中写入 2025-3-1 这一串内容,pandas和excel将会怎么进行解析?
Q2: 如果是在excel中写入类似于日期这样格式的数据,在输入之后就会立马被转换成默认日期格式
在excel中,总是计算1899-12-30 这个到这个输入日期之间的天数,比如输入2025-3-1后会自动解析成数值 45658,这个数字是 1899-12-30 到 2025-3-1 之间的天数,当我们在excel中手动设置日期的格式,只是在选择显示的内容的格式
在pandas中,要解析这个数字需要使用特定的类来管理,这就是 timestamp 这个类,要想将45658 转换成一个 timestamp,可以通过 pd.to_datetime() 这个接口将数值传入,返回一个timestamp 类,这个类包含年月日时分秒。还需要指定计算起始日期(1899-12-30),下面是to_datetime 接口以及用法示例
to_datetime(arg, errors, dayfirst, yearfirst, format, unit, origin, utc, infer_datetime_format, cache)# 常见用法如下,执行下面的代码后, time_stamp 为 Timestamp('2025-03-01 00:00:00')
time_stamp = pd.to_datetime(45658, origin='1899-12-30', unit='d'),
Q3: 在 mysql 执行查询后,把00:15所在列规定为 VARCHAR 类型,通过pymysql和pandas将这一列的查询结果进行管理,再将结果放到excel中进行管理,那么pandas和excel将会怎么进行解析?
# 问题对应的python代码示例
connection = pymysql.connect(**db_config)
cursor = connection.cursor()
query = """
SELECT province AS '省份', info_date AS '日期', time_part AS '时刻', bidding_space AS '竞价空间'
FROM `cost_daily`
WHERE info_date BETWEEN '2024-01-01' AND '2025-06-30' AND (province = '蒙西' OR province = '福建' OR province = '山西')
""" # 替换为你的查询语句和表名。cursor.execute(query)
results = cursor.fetchall()
df = pd.DataFrame(results, columns=[desc[0] for desc in cursor.description]) # 将结果转换为DataFrame。确保列名正确对应。df.to_excel('output.xlsx', index=False, engine='openpyxl') # 使用openpyxl引擎保存到Excel文件。或者使用engine='xlsxwriter'。
cursor.close() # 关闭游标。
connection.close() # 关闭数据库连接。
A3: 往excel里输入 00:15 这样类似于时刻这样格式的数据,在输入之后就会立马被转换为默认时间格式。但是如果是经过问题中的过程往excel里写数据,那么pandas和excel都会将其转换为字符串格式,此时就要尤其注意这两种方式的匹配问题。
如果在excel中键入00:15,会将输入直接识别为 0:15 这样的格式。但是问题中在写入excel之后将会变成文本格式。
在pandas中,会将excel中键入的00:15直接识别为 time 对象。pandas也会将其识别为字符串。
那么问题中的的sql写入的00:15(字符串数据)如果碰见了 excel键入的0:15()转换为 datetime.time 类型的数据,怎么相互转换呢?
# 假设df1这个dataframe的 时刻 这一列放着00:15字符串
# 想要转换成datetime.time()类,执行以下两行代码
df1['时刻'] = pd.to_datetime(df1['时刻'], format='%H:%M').dt.strftime('%H:%M:00')
df1['时刻'] = pd.to_datetime(df1['时刻'], format='%H:%M:%S').dt.time# 假设df这个dataframe的 时间 这一列放着值为 0:15 datetime.time()对象
# 想要转换成字符串,执行以下一行代码
df['时间'] = pd.to_datetime(df['时间'], format='%H:%M').dt.strftime('%H:%M:00')
其中 strftime('%H:%M:00') 将字符串或者 datetime.time() 对象转换成指定的字符串格式,但是最好加上 :00,保证标准统一