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

时间:2019-07-02 15:43:16

标签: pandas datetime

我有一个从数据库读取的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]?

1 个答案:

答案 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列),结果是日期和整数的奇怪混合。

我的建议是replacefillna

df['date'] = (
    pd.to_datetime(df['date'].replace('999999999999999', np.nan))
      .fillna(pd.Timestamp.max))