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

Posted

技术标签:

【中文标题】在有空值的日期上使用 lambda 和 strftime (Pandas)【英文标题】:Using lambda and strftime on dates when there are null values (Pandas) 【发布时间】:2016-05-31 00:09:51 【问题描述】:

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

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

?

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

【问题讨论】:

“也许是……”这就是我要建议的。成功了吗? 可悲的是。我尝试过不同的形式。 .notnull(), != np.nan, != "NaT", != "NaN,但是没有一个起作用,所以我想知道方法是否错误 【参考方案1】:

您不应该检查 nan/nat (un)equality,但 .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

这与@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

【讨论】:

【参考方案2】:

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

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

【讨论】:

对不起。当我开始编辑我的答案时,你还没有回答。我更喜欢函数定义,因为我认为它更容易阅读。这就是为什么我以“个人”开头的原因。后来我突然想到,他们可能不喜欢那样做。 这两种方法最终都给了我关于空值的相同错误。 Goyo 的解决方案对我有用,所以我将其标记为答案【参考方案3】:

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

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

【讨论】:

由于某种原因,这种方法仍然给我同样的错误,我得到了关于空值的错误。 Goyo 的解决方案对我有用,所以我将其标记为答案 我想这取决于您所说的“某些字段中的空值”(None vs. NaT vs. NaN)是什么意思。我假设没有,但使用 notnull() 包括其他情况。示例数据有助于创建更符合您要求的解决方案。 啊,你完全正确。它是 NaT,因为它是日期时间格式,对此我深表歉意。

以上是关于在有空值的日期上使用 lambda 和 strftime (Pandas)的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark SQL:在数据透视表中保留只有空值的条目

pandas删除指定列中有空值的行

练习_使用Lambda表达式无参数无返回值的练习练习_使用Lambda表达式有参数有返回值的练习

默认日期约束有空记录

如何判断具有空字符串值的 python 字符串变量在初始化时是使用单引号还是双引号?

Oracle:查找只有空值的列