You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中将无日字符串转为日期时间并写入MySQL?

解决方法:将字符串年月转为日期时间类型并存入MySQL

首先得明确一点:Python的datetime对象和MySQL的DateTime类型都必须包含具体的日期(年、月、日),不存在“无日”的原生日期时间类型。你看到的2012-12其实是一种格式化后的字符串展示,而不是真正的日期时间对象。所以我们的思路是:把字符串转成当月第一天的日期时间对象,存储到MySQL后,业务上可以视为年月来使用,需要展示时再格式化为YYYY-MM的形式。

第一步:在Pandas中转换字符串为日期时间类型

比起你用列表推导式调用datetime.strptime,更推荐用Pandas内置的to_datetime函数,效率更高且更简洁:

import pandas as pd

# 转换字符串为datetime64类型,默认会把日设为当月1号
df['issue_d'] = pd.to_datetime(df['issue_d'], format='%b-%Y')

执行后,df['issue_d']的值会是类似2012-12-01的datetime64类型,这是标准的日期时间对象格式。如果只是想在Python中展示为2012-12的形式,可以用dt.strftime转成字符串,但注意这会丢失日期时间类型:

# 仅用于展示,会转回字符串类型
df['issue_d_display'] = df['issue_d'].dt.strftime('%Y-%m')

如果你想在Python中保留年月的语义(而非完整日期),可以用Pandas的Period类型:

df['issue_d_period'] = pd.to_datetime(df['issue_d'], format='%b-%Y').dt.to_period('M')

这会得到2012-12这样的Period对象,但SQLAlchemy不支持直接将Period存入MySQL的DateTime列,所以存储前需要转回到datetime64类型(取当月第一天):

# 转回到datetime64用于存储
df['issue_d'] = df['issue_d_period'].dt.to_timestamp()

第二步:用SQLAlchemy存入MySQL的DateTime列

假设你用SQLAlchemy的create_engine连接数据库,然后用df.to_sql写入数据:

from sqlalchemy import create_engine

# 建立数据库连接
engine = create_engine('mysql+pymysql://username:password@host:port/db_name')

# 将DataFrame写入MySQL,指定列类型为DateTime
df.to_sql(
    name='your_table_name',
    con=engine,
    if_exists='replace',  # 根据需求选择append/replace等
    dtype={'issue_d': 'DateTime'}
)

写入后,MySQL的DateTime列中会存储类似2012-12-01 00:00:00的值,这符合MySQL的DateTime类型要求。如果查询时只需要年月信息,可以用MySQL的内置函数格式化:

SELECT DATE_FORMAT(issue_d, '%Y-%m') AS issue_month FROM your_table_name;

为什么你的方法会得到带日的结果?

因为datetime.strptime解析%b-%Y格式时,Python会自动补全日为当月的第一天(这是datetime对象的默认行为,因为它必须包含年、月、日三个部分),所以结果必然带有日期部分,这是正常现象。

内容的提问来源于stack exchange,提问作者Love_Code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:09:50