Python Pandas:TypeError:“>”在选择日期列时,在“int”和“str”实例之间不受支持

Python Pandas:TypeError:“>”在选择日期列时,在“int”和“str”实例之间不受支持,python,pandas,Python,Pandas,我有一个带有时间戳的列的数据帧。我可以从此列中选择日期范围。但是在我更改了DataFrame中的其他列之后,我无法再更改了,我得到了错误TypeError:“>”在“int”和“str”的实例之间不受支持 下面的代码再现了该问题: 生成带有一些随机数的数据帧 添加带有日期的列 在“日期”列中选择 df = pd.DataFrame(np.random.random((200,3))) df['date'] = pd.date_range('2000-1-1', periods=200, freq

我有一个带有时间戳的列的数据帧。我可以从此列中选择日期范围。但是在我更改了DataFrame中的其他列之后,我无法再更改了,我得到了错误TypeError:“>”在“int”和“str”的实例之间不受支持

下面的代码再现了该问题:

生成带有一些随机数的数据帧 添加带有日期的列 在“日期”列中选择

df = pd.DataFrame(np.random.random((200,3)))
df['date'] = pd.date_range('2000-1-1', periods=200, freq='D')
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')
print(df.loc[mask])
但是,现在如果列0超过0.7,我将其设置为0,并重复:

df[df[0] > 0.7] = 0
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')

为什么会发生这种情况以及如何避免这种情况?

如果检查输出问题是DateTime设置为0,因为没有为set指定列,所以请设置所有列:

df[df[0] > 0.7] = 0

print (df.head(10))
          0         1         2                 date
0  0.420593  0.519151  0.149883  2000-01-01 00:00:00
1  0.014364  0.503533  0.601206  2000-01-02 00:00:00
2  0.099144  0.090100  0.799383  2000-01-03 00:00:00
3  0.411158  0.144419  0.964909  2000-01-04 00:00:00
4  0.151470  0.424896  0.376281  2000-01-05 00:00:00
5  0.000000  0.000000  0.000000                    0
6  0.292871  0.868168  0.353377  2000-01-07 00:00:00
7  0.536018  0.737273  0.356857  2000-01-08 00:00:00
8  0.364068  0.314311  0.475165  2000-01-09 00:00:00
9  0.000000  0.000000  0.000000                    0
解决方案仅由以下数值列设置:

另一种解决方案是创建DatetimeIndex,如果其他所有列都是数字:

df = df.set_index('date')
df.loc[df[0] > 0.7] = 0

print (df.head(10))
                   0         1         2
date                                    
2000-01-01  0.316875  0.584754  0.925727
2000-01-02  0.000000  0.000000  0.000000
2000-01-03  0.326266  0.746555  0.825070
2000-01-04  0.492115  0.508553  0.971966
2000-01-05  0.160850  0.403678  0.107497
2000-01-06  0.000000  0.000000  0.000000
2000-01-07  0.047433  0.103412  0.789594
2000-01-08  0.527788  0.415356  0.926681
2000-01-09  0.468794  0.458531  0.435696
2000-01-10  0.261224  0.599815  0.435548

您可以将时间戳时间戳'2000-01-01 00:00:00'与字符串进行比较,pandas将为您将字符串转换为时间戳。但一旦将该值设置为0,就无法将int与str进行比较

另一种解决方法是改变操作顺序

filters = df[0] > 0.7
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')

df[filters] = 0
print(df.loc[mask & filters])

那么你应该不会对原来的面具有任何问题。

对我来说,这是循环的问题

确保在获取特定的过滤数据帧时,通过以下方式将数据时间列更改为日期时间列:

df_new['date-like_column'] = pd.to_datetime(df_new['date-like-column']
df = df.set_index('date')
df.loc[df[0] > 0.7] = 0

print (df.head(10))
                   0         1         2
date                                    
2000-01-01  0.316875  0.584754  0.925727
2000-01-02  0.000000  0.000000  0.000000
2000-01-03  0.326266  0.746555  0.825070
2000-01-04  0.492115  0.508553  0.971966
2000-01-05  0.160850  0.403678  0.107497
2000-01-06  0.000000  0.000000  0.000000
2000-01-07  0.047433  0.103412  0.789594
2000-01-08  0.527788  0.415356  0.926681
2000-01-09  0.468794  0.458531  0.435696
2000-01-10  0.261224  0.599815  0.435548
filters = df[0] > 0.7
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')

df[filters] = 0
print(df.loc[mask & filters])
df.loc[df[0] > 0.7, 0] = 0
df_new['date-like_column'] = pd.to_datetime(df_new['date-like-column']