繁体   English   中英

Python Pandas Dataframe按Timedelta列值删除行

[英]Python Pandas Dataframe Remove Rows by Timedelta Column Value

我试图从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)]

我想避免迭代所有的行,但如果这就是我必须做的事情,那么我会这样做。

非常感谢您的帮助!

编辑:我真正的问题是我的'Elapsed time'列的dtype是object而不是timedelta。 快速解决方法是使用下面的代码来转换dtype,但更好的解决方法是确保首先不将dtype设置为对象类型。 谢谢大家的帮助和评论。

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

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM