如何在列中缺少/ NaT值时转换日期格式

时间:2018-04-23 22:04:06

标签: python python-3.x pandas date missing-data

我有几个日期列,我想将它们转换为月/日/年格式。假设test是日期列之一 - 下面代码可以工作。

dfq['test1'] = dfq['test1'].apply(lambda x: x.strftime('%m/%d/%Y'))

但是当列中缺少值为'NaT'时,它会显示错误 ValueError:NaTType不支持strftime。我创建了一个示例数据集,故意将一个缺失值保存为''。在这种情况下,它也显示错误。

我想保留缺失或NaT值,因此无法删除它们。还有其他方法吗?

另一个问题,如果我想同时转换所有日期列(比如test1,test,test3),有没有办法在使用lambda / strftime时这样做?

2 个答案:

答案 0 :(得分:2)

您应该使用pd.Series.dt.strftime,它会优雅地处理NaT

import pandas as pd

s = pd.Series(['2018-01-01', 'hello'])

s = pd.to_datetime(s, errors='coerce')

# 0   2018-01-01
# 1          NaT
# dtype: datetime64[ns]

s = s.dt.strftime('%m/%d/%Y')

print(s)

# 0    01/01/2018
# 1           NaT
# dtype: object

对于您的第二个问题,我不相信datetimestr转换可以进行矢量化。您可以轻松地执行此操作:

for col in ['col1', 'col2', 'col3']:
    df[col] = df[col].dt.strftime('%m/%d/%Y')

或更好:

for col in df.select_dtypes(include=['datetime']):
    df[col] = df[col].dt.strftime('%m/%d/%Y')

答案 1 :(得分:0)

这是另一种更加灵活的解决方案,因为它也可以与pd.style.format()一起使用,这正是我遇到的问题。只需将时间格式器包装在函数中并捕获错误,并在抛出错误时返回NaT。然后,您可以在其中使用所需的任何时间格式化功能。

def format_time_nat(t, fmt='{:%d-%b-%y}'):
    try:
        return fmt.format(t) # or strftime
    except ValueError:
        return t

dfq['test1'] = dfq['test1'].apply(format_time_nat)

# when using pd.style.format()
colstyles = {
    'test1' : format_time_nat
}
dfq.style.format(colstyles)