【问题标题】:How to count values between timestamps in a pandas dataframe如何计算熊猫数据框中时间戳之间的值
【发布时间】:2021-02-06 06:39:45
【问题描述】:

我有一个看起来像这样的 Pandas DataFrame:

>>> df
       Start_Time           End_Time
0      2014-10-16 15:05:17  2014-10-16 17:13:14
1      2014-10-16 14:56:37  2014-10-16 15:07:17
2      2014-10-16 14:25:16  2014-10-16 18:06:17
...

现在,我有另一个包含多个时间戳的 DataFrame:

>>> times
       Time           
0      2014-10-16 15:17:17
1      2014-10-16 14:53:37
2      2014-10-16 14:26:16
...

我最后想要收到的是行数,其中 Start_Time

>>> times
       Time                 Count          
0      2014-10-16 15:17:17  1
1      2014-10-16 15:05:37  2
2      2014-10-16 14:26:16  1
...

当然,我可以通过遍历时间并使用 loc 创建 sub_dfs 来做到这一点:

  ls_len = []    
  for index, row in times.iterrows():
     sub_df = df.loc[(df['Start_Time']<row['Time']) & (df['End_Time']>row['Time'])]
     ls_len.append(len(sub_df))
  times['Count'] = ls_len

但这非常耗时并且感觉不是最佳的。有没有办法在不迭代的情况下执行此操作? 非常感谢你们!

【问题讨论】:

  • DataFrames 的大小是多少?
  • 不幸的是相当大,第一个包含几百万行。
  • 也许您可以将原来的df 拆分成几个较小的以加快搜索速度?
  • 我可以尝试,但这将基于很多假设(例如,每行的持续时间 [end_time-start_time] 不应长到几天),所以这会有点有点冒险。

标签: python pandas count timestamp


【解决方案1】:
  #This is more optimal than looping        
  def count_val(x):
     sub_df = df.loc[(df['Start_Time']<x['Time']) & (df['End_Time']>x['Time'])]
     count = len(sub_df)
     return count

  times['count'] = times.apply(count_val, axis=1)

【讨论】:

  • 优雅一点:return ((df['Start_Time'] &lt; x['Time']) &amp; (x['Time'] &lt; df['End_Time'])).sum()
猜你喜欢
  • 2013-06-23
  • 2015-08-09
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多