抓取两个日期时间之间的行并避免迭代

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/…。过段时间我会回答的

以上是关于抓取两个日期时间之间的行并避免迭代的主要内容,如果未能解决你的问题,请参考以下文章

查找具有延期日期范围的行并累积其持续时间

SQL查询选择年份在两个日期之间的行

Pandas Dataframe 保留日期在两个日期之间的行(单独的列)

BETWEEN Two Dates 返回相同两个日期的行,而不是返回之间的行

使用java在sqlite中选择两个日期之间的行

Pandas - 两个日期之间的月数