我有一个从数据库中读入的DataFrame。它保存的日期告诉我一行的有效性,不幸的是,是以十进制格式(14位数,就像这个20190130110429);另外,如果条目仍然有效(即日期是将来的),则列保存999999999999999 (15个9)。
当我尝试使用以下命令将其转换为日期时间时
pd.to_datetime(df['date'],format='%Y%m%d%H%M%S')它对999失败...条目。我试着把这两种情况分开考虑
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')但这混合了几种类型:
[(x,type(x)) for x in df['date']
[(datetime.datetime(9999, 12, 31, 23, 59, 59, 999999), datetime.datetime),
(1548846269000000000, int),
...
]有没有办法很好地处理这件事?
附言:就在发送问题之前,我只是通过
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
发布于 2019-07-02 23:46:45
pd.to_datetime返回一个Timestamp
pd.to_datetime('20190130110429')
# Timestamp('2019-01-30 11:04:29')这是pandas的原生datetime格式。pd.datetime是一种不同的类型(datetime.datetime)。它们是不同的,有时是不兼容的。你所拥有的就是一个很好的例子。具体地说,你会注意到它们有不同的最大值。
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列),结果是日期和整数的奇怪组合。
我的建议是replace和fillna
df['date'] = (
pd.to_datetime(df['date'].replace('999999999999999', np.nan))
.fillna(pd.Timestamp.max))https://stackoverflow.com/questions/56855988
复制相似问题