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

如何高效处理pandas中OutOfBoundsDatetime并生成毫秒级时间戳?

优化Pandas中早于1677年日期的时间戳转换方法

问题背景

用Pandas转换日期字符串为时间戳时,早于1677年的日期会触发OutOfBoundsDatetime错误。当前用循环+try-except捕获异常并替换为指定最小日期的时间戳,但这种方法效率偏低,同时需要生成毫秒级时间戳,希望找到更高效的矢量化处理方案。

原测试代码(直接转换会报错):

import pandas as pd
df = pd.DataFrame({'datetime_str': ['2011-01-17 23:20:00' ,'0031-01-17 23:20:00']})
df['datetime_str'] = (pd.to_datetime(df['datetime_str']).astype(int) / 10 ** 6).astype(int)

当前低效处理代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'datetime_str': ['2011-01-17 23:20:00', '0031-01-17 23:20:00']})

# convert the datetime string to epoch time
epoch_time = []
for dt_str in df['datetime_str']:
    try:
        epoch_time.append(int(pd.to_datetime(dt_str).timestamp()))
    except pd.errors.OutOfBoundsDatetime:
        epoch_time.append(int(pd.Timestamp('1970-09-21 00:12:43.145225').timestamp()))

df['epoch_time'] = epoch_time
print(df['epoch_time'])

高效解决方案

用Pandas矢量化操作替代循环,步骤如下:

  1. 借助pd.to_datetime的errors='coerce'参数,把无效日期转为NaT(Not a Time)
  2. 用指定的最小日期填充NaT值
  3. 直接转换为毫秒级时间戳(Pandas的datetime64类型存储纳秒数,除以1e6得到毫秒数)

代码实现:

import pandas as pd

df = pd.DataFrame({'datetime_str': ['2011-01-17 23:20:00', '0031-01-17 23:20:00']})

# 定义替换的最小日期
min_valid_timestamp = pd.Timestamp('1970-09-21 00:12:43.145225')

# 转换日期字符串,无效值转为NaT,再填充为指定最小日期
dt_series = pd.to_datetime(df['datetime_str'], errors='coerce').fillna(min_valid_timestamp)

# 转换为毫秒级时间戳(纳秒数除以1e6后转整数)
df['epoch_ms'] = (dt_series.astype('int64') // 10**6).astype('int')

print(df['epoch_ms'])

方案优势

  • 矢量化操作:避开Python循环,处理大规模数据时效率提升明显
  • 毫秒级精度:通过astype('int64')直接获取纳秒数,除以1e6得到准确的毫秒级时间戳
  • 代码简洁:用Pandas内置方法完成转换、填充、时间戳生成,可读性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:22:11