抓取两个日期时间之间的行并避免迭代
Posted
技术标签:
【中文标题】抓取两个日期时间之间的行并避免迭代【英文标题】:Grab rows between two Datetime and avoid iterating 【发布时间】:2016-01-31 18:41:00 【问题描述】:我使用 Pandas 通过 SQL 查询(来自 Hive)检索大量数据。我现在有一个大数据框:
market_pings = pandas.read_sql_query(query, engine)
market_pings['event_time'] = pandas.to_datetime(market_pings['event_time'])
我计算了Time Delta
时间段,它们是:如果在这个market_pings
DataFrame 内的这些事件的时间线内发生了一些有趣的事情,我只想要那个时间间隔的日志。
要抓取列具有特定值的 DataFrame 行,有一个很酷的技巧:
valuelist = ['value1', 'value2', 'value3']
df = df[~df.column.isin(value_list)]
有没有人知道如何在时间段内执行此操作,以便我从 market_pings 数据帧中获取特定时间的事件而无需直接迭代(逐行)? 我可以建立一个周期列表(1s 精度),例如:
2015-08-03 19:19:47
2015-08-03 19:20:00
但这意味着我的valuelist
变成了一个元组,我必须以某种方式比较日期。
【问题讨论】:
喜欢列表中的值,您想要列表中的时间戳,对吗?还是您在寻找其他东西? 您希望 DataFrame 中的记录在一个时间间隔内(在开始时间之后和结束时间之前)具有事件时间,还是在给定时间列表内具有事件时间?跨度> 完全正确;所以在这种情况下,我希望事件时间在间隔内。 2015-08-03 19:19:47 至 2015-08-03 19:20:00。不是具体值。 【参考方案1】:您可以创建一个时间戳列表作为 value_list 并执行您想要的操作。
time_list = [pd.Timestamp('2015-08-03 19:19:47'),pd.Timestamp('2015-08-03 19:20:00') ]
使用 between_time() 的一件事是索引必须是那个日期或时间, 如果没有你可以通过set_index()设置
mydf = pd.Series(np.random.randn(4), time_list)
mydf
Out[123]:
2015-08-03 19:19:47 0.632509
2015-08-03 19:20:00 -0.234267
2015-08-03 19:19:48 0.159056
2015-08-03 21:20:00 -0.842017
dtype: float64
mydf.between_time(start_time=pd.Timestamp('2015-08-03 19:19:47'),
end_time=pd.Timestamp('2015-08-03 19:20:00'),include_end=False)
Out[124]:
2015-08-03 19:19:47 0.632509
2015-08-03 19:19:48 0.159056
dtype: float64
mydf.between_time(start_time=pd.Timestamp('2015-08-03 19:19:47'),
end_time=pd.Timestamp('2015-08-03 19:20:00'),
include_end=False,include_start=False)
Out[125]:
2015-08-03 19:19:48 0.159056
dtype: float64
【讨论】:
在这种情况下,我会收到 2 个带有这些确切时间戳的事件。但是,两者之间的事件会被忽略。我可以构建一个 time_list 并在循环中添加图章。但这意味着我非常依赖准确性,并且在大周期的情况下我会膨胀 time_list。 @wishi:看看这个,pandas.pydata.org/pandas-docs/stable/generated/…。过段时间我会回答的以上是关于抓取两个日期时间之间的行并避免迭代的主要内容,如果未能解决你的问题,请参考以下文章
Pandas Dataframe 保留日期在两个日期之间的行(单独的列)