Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列中缺少/NaT值时如何转换日期格式_Python_Python 3.x_Pandas_Date_Missing Data - Fatal编程技术网

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

Python 列中缺少/NaT值时如何转换日期格式,python,python-3.x,pandas,date,missing-data,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值,因此无法删除它们。还有别的办法吗 另一个问题,如果我想同

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

dfq['test1'] = dfq['test1'].apply(lambda x: x.strftime('%m/%d/%Y'))
但当列中缺少值“NaT”时,它会显示错误 ValueError:NaTType不支持strftime。我创建了一个示例数据集,并故意将一个缺少的值保留为“”。在这种情况下,它也显示错误

我想保留丢失的或NaT值,因此无法删除它们。还有别的办法吗

另一个问题,如果我想同时转换所有的日期列(比如test1、test、test3),那么在使用lambda/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

关于你的第二个问题,我不相信
datetime
str
的转换可以矢量化。您可以轻松做到这一点:

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')

这里有另一个更灵活的解决方案,因为它也适用于
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)