为了账号安全,请及时绑定邮箱和手机立即绑定

比较字符串和 strftime 值时,运算符中的 Python 未按预期工作

比较字符串和 strftime 值时,运算符中的 Python 未按预期工作

撒科打诨 2021-05-30 17:54:47
我正在使用日期时间值转换为数据帧中的字符串(年)。我想使用in运算符检查我的 dataframe.year_as_string 列中是否存在给定的年份。但是,我的表达式意外地得出False(请参阅第二个打印语句)。为什么会发生这种情况?注意:我可能可以用更简单的方式解决我的问题(如在第三个打印语句中),但我真的很好奇为什么第二个语句的计算结果为 False。import pandas as pdind = pd.to_datetime(['2013-12-31', '2014-12-31'])df = pd.DataFrame([1, 2], index=ind)df = df.reset_index()df.columns = ['year', 'value']df['year_as_string'] = df.year.dt.strftime('%Y')# 1. the string '2013' is equal to the first element of the listprint('2013' == df['year_as_string'][0])# 2. but that same string is not 'in' the list?! Why does this evaluate to False?print('2013' in df['year_as_string'])# 3. I further saw that strftiming the DatetimeIndex itself does evaluate as I would expectyear = ind.strftime('%Y')print('2013' in year)
查看完整描述

3 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

in使用 Pandas 系列的运算符将检查索引,就像使用in字典只会检查键一样。相反,您可以将其in与系列的NumPy数组表示形式一起使用:

'2013' in df['year_as_string'].values

一种更可恶的方法是构造一个布尔序列,然后使用pd.Series.any

(df['year_as_string'] == '2013').any()

等效地:

df['year_as_string'].eq('2013').any()

更好的是,除非绝对必要,否则避免转换为字符串:

df['year_as_int'] = df['year'].dt.year
df['year_as_int'].eq(2013).any()


查看完整回答
反对 回复 2021-06-01
?
慕神8447489

TA贡献1780条经验 获得超1个赞

in在 apandas.Series检查索引中是否有内容,就像 a 一样dict文件资料


查看完整回答
反对 回复 2021-06-01
  • 3 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信