首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将pandas列转换为具有异常最大值的datetime

将pandas列转换为具有异常最大值的datetime
EN

Stack Overflow用户
提问于 2019-07-02 23:43:16
回答 1查看 2.1K关注 0票数 2

我有一个从数据库中读入的DataFrame。它保存的日期告诉我一行的有效性,不幸的是,是以十进制格式(14位数,就像这个20190130110429);另外,如果条目仍然有效(即日期是将来的),则列保存999999999999999 (15个9)。

当我尝试使用以下命令将其转换为日期时间时

代码语言:javascript
复制
pd.to_datetime(df['date'],format='%Y%m%d%H%M%S')

它对999失败...条目。我试着把这两种情况分开考虑

代码语言:javascript
复制
df['date'] = df['date'].astype(str)
mask = df['date']=='999999999999999'
df.loc[~mask,'date'] = pd.to_datetime(df.loc[~mask,'date'],format='%Y%m%d%H%M%S')
df.loc[mask,'date'] = pd.datetime.max # also tried np.datetime64(pd.datetime.max,unit='s')

但这混合了几种类型:

代码语言:javascript
复制
[(x,type(x)) for x in df['date']

[(datetime.datetime(9999, 12, 31, 23, 59, 59, 999999), datetime.datetime),
 (1548846269000000000, int),
...
]

有没有办法很好地处理这件事?

附言:就在发送问题之前,我只是通过

代码语言:javascript
复制
    df['date'] = df['date'].astype(str)
    df['date'] = df['date'].str.replace('999999999999999',pd.Timestamp.max.strftime('%Y%m%d%H%M%S'))
    df['date'] = pd.to_datetime(df['date'],format='%Y%m%d%H%M%S')

这给了我'2262-04-11 23:47:16.854775807‘作为最大日期。(如何)可以存储datetime64s或us How而不是datetime64ns

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-02 23:46:45

pd.to_datetime返回一个Timestamp

代码语言:javascript
复制
pd.to_datetime('20190130110429')
# Timestamp('2019-01-30 11:04:29')

这是pandas的原生datetime格式。pd.datetime是一种不同的类型(datetime.datetime)。它们是不同的,有时是不兼容的。你所拥有的就是一个很好的例子。具体地说,你会注意到它们有不同的最大值。

代码语言:javascript
复制
pd.datetime.max
# datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
pd.Timestamp.max
# Timestamp('2262-04-11 23:47:16.854775807')

由于前者与后者不兼容,因此结果是一个对象列(pandas不能将其转换为标量Timestamp列),结果是日期和整数的奇怪组合。

我的建议是replacefillna

代码语言:javascript
复制
df['date'] = (
    pd.to_datetime(df['date'].replace('999999999999999', np.nan))
      .fillna(pd.Timestamp.max))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56855988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档