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

为何用Pandas为Series赋值Timestamp会转为整数?如何避免?

Pandas Series添加Timestamp变整数?原因和解决办法看这里

先还原一下你遇到的场景,运行这段代码:

import pandas as pd
from datetime import datetime

g = pd.Series(dict(a = 5, b = datetime(2018, 1,1)))
g['datetime'] = pd.Timestamp('2018-01-02')

得到的结果里,新添加的Timestamp居然变成了一串大整数:

a                        5
b        2018-01-01 00:00:00
datetime    1514851200000000000
dtype: object

为啥会这样?

核心原因是你最开始创建的Series dtype是object——因为里面混合了普通整数(5)和Python标准库的datetime.datetime对象。当你往这个object类型的Series里塞pd.Timestamp时,Pandas没办法在现有的object数组里直接存Timestamp对象,就自动把它转成了纳秒级的Unix时间戳整数(也就是Timestamp对应的底层数值),以此来保证整个数组的类型一致性。

怎么解决?给你三种靠谱方法

方法1:提前统一类型(适合全时间相关的场景)

如果你的Series最终要存的都是时间类数据,那一开始就把所有元素都转成pd.Timestamp再创建Series:

import pandas as pd
from datetime import datetime

# 把整数5也转成Timestamp(这里用unit='D'表示按天算,你可以根据需求调整)
g = pd.Series(dict(a = pd.Timestamp(5, unit='D'), b = pd.Timestamp(datetime(2018, 1,1))))
g['datetime'] = pd.Timestamp('2018-01-02')

这样整个Series的dtype会变成datetime64[ns],所有元素都是Timestamp类型,不会出现转换问题。

方法2:用pd.concat拼接新元素(适合混合类型场景)

如果需要保留整数和时间戳混合的情况,直接赋值容易触发转换,那咱们就创建一个新的单个元素Series,再和原Series拼接:

import pandas as pd
from datetime import datetime

g = pd.Series(dict(a = 5, b = datetime(2018, 1,1)))
# 单独创建新元素的Series
new_entry = pd.Series({'datetime': pd.Timestamp('2018-01-02')})
# 拼接成新的Series
g = pd.concat([g, new_entry])

这时候再看结果,datetime就会保持Timestamp类型:

a                        5
b        2018-01-01 00:00:00
datetime   2018-01-02 00:00:00
dtype: object

方法3:用列表包裹赋值(简单直接的小技巧)

还有个更简单的方式,给新元素赋值时用列表把Timestamp包起来,让Pandas识别为要存储对象而不是自动转换:

g['datetime'] = [pd.Timestamp('2018-01-02')]

这个方法不需要额外拼接,直接修改原Series就能生效,亲测好用~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:08:03