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

datetime.strptime转换浮点日期时10月被误转为1月的问题咨询

浮点格式日期转换异常的原因及解决方法

异常原因

核心问题出在浮点数转字符串时的格式丢失:浮点类型的1871.10转为字符串后会变成"1871.1"(浮点数不存储末尾无意义的0),而datetime.strptime用"%Y.%m"格式解析时,会把".1"识别为月份1(自动补前导0为01),因此生成错误的1871-01-01。

解决方法

方法1:格式化浮点数为固定两位小数的字符串

先将浮点数格式化为保留两位小数的字符串,确保月份始终是两位数字,再进行日期解析:

from datetime import datetime
import pandas as pd

df["Date"] = df["Date"].apply(lambda x: datetime.strptime(f"{x:.2f}", "%Y.%m"))

或者使用str.format实现相同效果:

df["Date"] = df["Date"].apply(lambda x: datetime.strptime("{0:.2f}".format(x), "%Y.%m"))

方法2:直接拆分年份和月份(高效推荐)

跳过字符串转换,直接从浮点数中提取年份和月份,用pandas原生方法构造日期,适合大数据量场景:

import pandas as pd

df["Date"] = pd.to_datetime(
    {
        "year": df["Date"].astype(int),
        "month": (df["Date"] % 1 * 100).astype(int),
        "day": 1
    }
)

原理:

  • df["Date"].astype(int)提取浮点数的整数部分作为年份(如1871.10→1871)
  • df["Date"] % 1获取小数部分(0.10),乘以100后取整得到月份(10)
  • 通过字典参数直接传递年、月、日给pd.to_datetime,无需逐行解析,效率更高。

方法3:正则补全字符串格式

先将浮点数转为字符串,用正则表达式补全小数部分到两位,再用pd.to_datetime解析:

import pandas as pd

df["Date"] = pd.to_datetime(
    df["Date"].astype(str).str.replace(r"(\.\d)$", r"\10"),
    format="%Y.%m"
)

原理:正则表达式(\.\d)$匹配小数部分只有一位的字符串(如"1871.1"),替换为"\10"即末尾补0,变成"1871.10"后再解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:35:24