在存在空值的日期上使用 lambda 和 strftime (Pandas)

Using lambda and strftime on dates when there are null values (Pandas)

我正在尝试使用 lambda 和 strftime 更改我的 Dataframe 中日期时间列的格式,如下所示

df['Date Column'] = df['Date Column'].map(lambda x: x.strftime('%m/%d/%Y'))

但是,由于我在其中一些字段中有空值,这给了我一个错误。我不能删除这些空行,因为其他列中的数据仍然需要它们。有没有办法在不删除空值的情况下解决这个错误。

可能是

df['Date Column'].map(lambda x: x.strftime('%m/%d/%Y') if x != null else "")

?

我使用的方法是删除空值,格式化列,然后将其合并回原始数据集,但这似乎是一种非常低效的方法。

我个人会定义一个小函数,然后使用它。

def to_string(date):
    if date:
        string = date.strftime('%Y%m%d')
    else:
        string = ""

    return string

然后

df['Date Column'].map(to_string) 

否则

df['Date Column'].map(lambda x: x.strftime('%Y%m%d') if x else "")

您可以使用条件赋值(三元)。

df['Date Column'] = df['Date Column'].map(lambda x: x.strftime('%m/%d/%Y') if x else '')

您不应该检查 nan/nat(不)相等,但 .notnull() 应该有效,它对我有用:

s = pd.date_range('2000-01-01', periods=5).to_series().reset_index(drop=True)
s[2] = None
s

0   2000-01-01
1   2000-01-02
2          NaT
3   2000-01-04
4   2000-01-05
dtype: datetime64[ns]

s.map(lambda x: x.strftime('%m/%d/%Y') if pd.notnull(x) else '')

0    01/01/2000
1    01/02/2000
2              
3    01/04/2000
4    01/05/2000
dtype: object

这 returns 与@Alexander 和@Batman 的回答相同,但更明确。对于大型系列,它也可能会稍微慢一些。

或者您可以使用 .dt 访问器。空值将被格式化为 NaT.

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

0    01/01/2000
1    01/02/2000
2           NaT
3    01/04/2000
4    01/05/2000
dtype: object