首页 > 解决方案 > 如何在要过滤的列中过滤具有重复值的 Python pandas 数据框中的行

问题描述

整体背景:

我有一个数据框,其中包含从早上 5 点开始到晚上 8 点结束的每五分钟的观察数天。我需要过滤每天从早上 9 点开始到晚上 5 点结束的所有观察结果。

输入数据框如下所示:

Date Time
2019-09-20 05:00:00,..,..
2019-09-20 05:05:00,..,..
...
2019-09-20 09:00:00,..,..
...
2019-09-20 17:00:00,..,..
2019-09-20 17:05:00,..,..
...
2019-09-20 20:00:00,..,..
2019-09-21 05:00:00,..,..
2019-09-21 05:05:00,..,..
...
2019-09-21 09:00:00,..,..
...
2019-09-21 17:00:00,..,..
2019-09-21 17:05:00,..,..
...
2019-09-21 20:00:00,..,..

输出数据框应如下所示:

2019-09-20 09:00:00,..,..
...
2019-09-20 17:00:00,..,..
2019-09-21 09:00:00,..,..
...
2019-09-21 17:00:00,..,..

迄今为止采取的步骤

为了提取上午 9 点到下午 5 点之间的行,我通过使用矢量化数据操作提取小时、分钟和秒来确定每行自午夜以来的秒数,因此输入数据帧将具有类似的列

Date Time, Number of seconds since midnight
2019-09-20 05:00:00,xxxx,..,..
2019-09-20 05:05:00,yyyy,..,..
...
2019-09-21,05:00:00,xxxx,..,..
2019-09-21, 05:05:00,yyyy,..,..

请注意,对于每天的同一时间,秒数将保持不变现在我希望提取上午 9 点到下午 5 点之间的所有行

df[(df['Number of seconds since midnight'] > (nseconds for 9 am from midnight)) &  ((df['Number of seconds since midnight'] < (nseconds for 5 pm from midnight))

但我只从上午 9 点到下午 5 点之间的最后一个日期获取行。对我来说,它看起来忽略了所有重复的行与 ehs ame calue。

任何人都可以提出一个可能的解决方案,它不会遍历每一行并使用矢量化操作,因为数据库非常大

标签: pythonpandasdataframe

解决方案


使用数据中 dateTime 对象中存在的 dateTime.hour,然后您可以根据大于 9 和小于或等于 5 或​​ (17) 过滤数据,然后添加到生成的数据框或大批

以下代码可能会对您有所帮助,

dummy = []
for d in dt:
    if d.hour>=9 and d.hour<=17: dummy.append(d)
print(dummy)

我从以下创建了我的示例数据,它也适用于多个日期,

start = datetime.datetime(2000, 1, 1)
dt = np.array([start + datetime.timedelta(hours=i) for i in range(24)])

欢迎任何更正。


推荐阅读