如何根据时间戳删除行(不在列表中)

时间:2019-07-22 17:38:28

标签: python pandas dataframe conditional-statements

我有一个大数据框(几百万行),其中我的一列是格式为“ hh:mm:ss”的时间戳(标记为“ Timestamp”)。 “ 07:00:04”。我想删除小时不在7到21之间的行。

我已经尝试将时间戳转换为字符串并使用切片,但是我无法使其工作,我相信应该有一种更有效的方法。

# Create list of opening hours (these should not be droped)
opening_hour = 7
closeing_hour = 21
trading_hours = []
for hour in range(closeing_hour - opening_hour + 1):
    add_hour = opening_hour + hour
    trading_hours.append(add_hour)

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

      Date Timestamp      Close
0  20180102  07:05:00  12925.979
1  20180102  21:05:02  12925.479
2  20180102  22:05:04  12925.280
3  20180102  23:55:06  12925.479
4  20180102  06:05:07  12925.780
5  20180103  07:05:07  12925.780
[...]

我想删除索引为2、3和4(有几千个)的行,因此结果应为:

  Date Timestamp      Close
0  20180102  07:05:00  12925.979
1  20180102  21:05:02  12925.479
2  20180103  07:05:07  12925.780
[...]

4 个答案:

答案 0 :(得分:2)

我更喜欢其他使用正确时间戳数据类型的答案,但是由于您提到尝试使用字符串切片方法尝试失败,因此使用有效的字符串切片解决方案可能对您有所帮助:

df['Hour'] = df['Timestamp'].str.slice(0, 2).astype(int)
df[(df['Hour'] >= 7) & (df['Hour'] <= 21)]

第一行从代表小时的字符串切片中创建一个新的整数列,第二行在所述新列上进行过滤。

       Date Timestamp      Close  Hour
0  20180102  07:05:00  12925.979     7
1  20180102  21:05:02  12925.479    21
5  20180103  07:05:07  12925.780     7

答案 1 :(得分:2)

首先,您可以给DataFrame适当的DatetimeIndex,如下所示:

dtidx = pd.DatetimeIndex(df['Date'].astype(str) + ' ' + df['Timestamp'].astype(str))
df.index = dtidx

,然后使用between_time获取介于07和21之间的小时数:

df.between_time('07:00', '22:00')
# returns
                         Date Timestamp   Close
2018-01-02 07:05:00  20180102  07:05:00   12926
2018-01-02 21:05:02  20180102  21:05:02 12925.5
2018-01-03 07:05:07  20180103  07:05:07 12925.8

答案 2 :(得分:2)

由于您提到切片,并且已经有人提到切片方法,所以我想向您介绍如何使用dt.hour

提取小时数。

首先将字符串类型的日期转换为日期时间类型的日期:

df['date'] = pd.to_datetime(df['date'])

您现在可以使用dt.hour轻松提取小时部分:

df['hour'] = df['date'].dt.hour

您还可以类似的方式提取年,月,秒等。

现在您可以像处理其他数据框一样进行常规过滤:

df[(df.hour >= 7) & (df.hour <= 21)]

答案 3 :(得分:1)

我的猜测是使用pd.between_time

df['Timestamp'] = pd.to_datetime(df['Timestamp'])
df.set_index('Timestamp').between_time('07:00:00', '21:59:59')
Timestamp           Date        Close
2019-07-22 07:05:00 20180102    12925.979
2019-07-22 21:05:02 20180102    12925.479
2019-07-22 07:05:07 20180103    12925.78