为何用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
相关产品推荐
相关产品推荐

