Python Pandas数据框通过时间差列值删除行

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
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时不将其设置为对象类型。谢谢大家的帮助和评论。
df_new = df[pd.to_timedelta(df['Elapsed time']) > pd.to_timedelta('3 seconds')]

1
df.dtypes 有什么内容? - jpp
`Start datetime64[ns]Elapsed time object` - ang mcg
@jpp 当我计算经过的时间时,我只是执行 datetime_end - datetime_start。而我从第一个解决方案中得到的错误是 无法将类型 'Timedelta' 与类型 'str' 进行比较。这真是令人沮丧,但感谢您指出这一点! - ang mcg
1个回答

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

2
没错,但从楼主的评论来看,问题在上游。楼主做了什么将dtype从“timedelta”转换为“object”。他们应该尝试修复工作流程中的这部分而不是稍后打补丁。 - jpp
1
Scott Boston自从加入SO以来一直在寻找read_clipboard方法。谢谢! - Charles Landau
1
jpp 是正确的 - 我的数据类型不是 timedelta,而是一个对象。我需要修复它,然后这可能会起作用。 - ang mcg
1
@angmcg,没错,只要确保你的序列不会被转换为“object”,你的第一个解决方案> pd.to_timedelta('3 seconds')就没有问题。 - jpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接