我有一个从数据库读取的DataFrame。它保留的日期告诉我一行的有效性,不幸的是,它采用的是十进制格式(像20190130110429
这样的14位数字);同样,如果该条目仍然有效(即日期是将来的日期),则该列将保留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),
...
]
有什么想法可以很好地解决这个问题吗?
PS:在发送问题之前,我已经通过
解决了 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”作为最大日期。 (如何)可以存储datetime64 [s]或[us]最大值而不是datetime64 [ns]?
答案 0 :(得分:1)
pd.to_datetime
返回一个Timestamp
:
pd.to_datetime('20190130110429')
# Timestamp('2019-01-30 11:04:29')
这是熊猫的原始日期时间格式。 OTOH,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')
由于前者与后者不兼容,结果是对象列(熊猫无法将其转换为标量Timestamp
列),结果是日期和整数的奇怪混合。
我的建议是replace
和fillna
:
df['date'] = (
pd.to_datetime(df['date'].replace('999999999999999', np.nan))
.fillna(pd.Timestamp.max))