Python Pandas Dataframe按Timedelta列值删除行

时间:2018-11-05 19:44:03

标签: python pandas

我正在尝试从数据帧中删除timedelta值少于几秒钟的行。

我的数据框看起来像这样:

                  Start     Elapsed time
0   2018-10-29 07:56:20  0 days 00:15:05
1   2018-10-29 07:56:20  0 days 00:15:05
2   2018-10-29 08:11:25  0 days 00:00:02
3   2018-10-29 08:11:27  0 days 00:00:08
4   2018-10-29 08:11:27  0 days 00:00:08
5   2018-10-29 08:11:35  0 days 00:00:02
6   2018-10-29 08:11:37  0 days 00:00:00

我想删除“经过时间”少于几秒钟的所有行-现在说3。所以我想要一个看起来像这样的数据框(从上面):

                  Start     Elapsed time
0   2018-10-29 07:56:20  0 days 00:15:05
1   2018-10-29 07:56:20  0 days 00:15:05
3   2018-10-29 08:11:27  0 days 00:00:08
4   2018-10-29 08:11:27  0 days 00:00:08

我尝试了许多不同的操作,产生了许多不同的错误消息-通常是不兼容的类型比较错误。例如:

df_new = df[df['Elapsed time'] > pd.to_timedelta('3 seconds')]
df_new = df[df['Elapsed time'] > datetime.timedelta(seconds=3)]

我想避免对所有行进行迭代,但是如果那是我必须要做的,那么我会做。

非常感谢您的帮助!

编辑:我的真正问题是我的“经过时间”列的dtype是对象而不是timedelta。一个快速的解决方法是使用下面的代码强制转换dtype,但更好的解决方法是确保首先不要将dtype设置为对象类型。谢谢大家的帮助和评论。

df_new = df[pd.to_timedelta(df['Elapsed time']) > pd.to_timedelta('3 seconds')]

1 个答案:

答案 0 :(得分:3)

使用pd.read_clipboard(sep ='\ s \ s +)获取数据

df = pd.read_clipboard(sep='\s\s+')
df['Elapsed time'] = pd.to_timedelta(df['Elapsed time'])

您可以使用:

df[df['Elapsed time'].dt.total_seconds() > 3]

输出:

                Start Elapsed time
0 2018-10-29 07:56:20     00:15:05
1 2018-10-29 07:56:20     00:15:05
3 2018-10-29 08:11:27     00:00:08
4 2018-10-29 08:11:27     00:00:08