Python 运算符在比较字符串和 strftime 值时未按预期工作
Python in operator not working as expected when comparing string and strftime values
我正在处理数据框中转换为字符串(年)的日期时间值。我想使用 in
运算符检查我的 dataframe.year_as_string 列中是否存在给定年份。但是,我的表达式出乎意料地计算为 False(请参阅第二个 print 语句)。为什么会这样?
注意:我可能可以用更简单的方式解决我的问题(如第 3 条 print 语句),但我真的很好奇为什么第二条语句的计算结果为 False。
import pandas as pd
ind = 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 list
print('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 expect
year = ind.strftime('%Y')
print('2013' in year)
in
在 pandas.Series
上检查索引中是否有内容,就像 dict
一样。 documentation
在您的第二条语句中,它检查索引号而不是列的值。如果你想检查你可以使用的值:
print('2013' in df.to_string(index = False, columns=['year_as_string']))))
带有 Pandas 系列的 in
运算符将检查索引,就像使用带有字典的 in
将仅检查键一样。相反,您可以将 in
与系列的 NumPy 数组表示形式一起使用:
'2013' in df['year_as_string'].values
一种更适合 Pandorable 的方法是构造一个布尔级数,然后使用 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()
您正在尝试检查字符串是否在 DateTimeIndex
中。 ind.strftime('%Y')
returns array(['2013', '2014'], dtype='|S4')
.
也许您的支票应该是:print('2013' in year.tolist())
我正在处理数据框中转换为字符串(年)的日期时间值。我想使用 in
运算符检查我的 dataframe.year_as_string 列中是否存在给定年份。但是,我的表达式出乎意料地计算为 False(请参阅第二个 print 语句)。为什么会这样?
注意:我可能可以用更简单的方式解决我的问题(如第 3 条 print 语句),但我真的很好奇为什么第二条语句的计算结果为 False。
import pandas as pd
ind = 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 list
print('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 expect
year = ind.strftime('%Y')
print('2013' in year)
in
在 pandas.Series
上检查索引中是否有内容,就像 dict
一样。 documentation
在您的第二条语句中,它检查索引号而不是列的值。如果你想检查你可以使用的值:
print('2013' in df.to_string(index = False, columns=['year_as_string']))))
带有 Pandas 系列的 in
运算符将检查索引,就像使用带有字典的 in
将仅检查键一样。相反,您可以将 in
与系列的 NumPy 数组表示形式一起使用:
'2013' in df['year_as_string'].values
一种更适合 Pandorable 的方法是构造一个布尔级数,然后使用 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()
您正在尝试检查字符串是否在 DateTimeIndex
中。 ind.strftime('%Y')
returns array(['2013', '2014'], dtype='|S4')
.
也许您的支票应该是:print('2013' in year.tolist())