我有一个大数据框(几百万行),其中我的一列是格式为“ 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
[...]
答案 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