在有空值的日期上使用 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)的主要内容,如果未能解决你的问题,请参考以下文章
练习_使用Lambda表达式无参数无返回值的练习练习_使用Lambda表达式有参数有返回值的练习