【问题标题】:Filtering pandas dataframe by difference of adjacent rows通过相邻行的差异过滤熊猫数据框
【发布时间】:2018-04-04 23:00:45
【问题描述】:

我有一个按日期时间索引的数据框。我想根据它们的索引和上一行的索引之间的差异来过滤掉行。

所以,如果我的条件是“删除比前一行晚一小时以上的所有行”,则应删除以下示例中的第二行:

2005-07-15 17:00:00  
2005-07-17 18:00:00  

在以下情况下,两行都保留:

2005-07-17 23:00:00  
2005-07-18 00:00:00 

【问题讨论】:

  • 2005-07-15 17:00:00, 2005-07-17 18:00:00 , 2005-07-17 19:00:00 19:00 应该发生什么
  • 但是2005-07-17 23:00:002005-07-18 00:00:00之间的时差是一小时,为什么不去掉呢?
  • 来自这个系列:pd.Timestamp('20170101') + pd.to_timedelta([-1, 0, 1, 2, 3, 5, 6.5, 7.5], unit='h'),你能说清楚哪些应该保留吗?
  • @jezrael 任何有超过一小时差异的行都应该被删除。
  • @MaartenFabré 仅应删除 2017-01-01 05:00:00。

标签: python python-3.x pandas datetime dataframe


【解决方案1】:

看来您需要boolean indexingdiff 来区分并与1 hour Timedelta 进行比较:

dates=['2005-07-15 17:00:00','2005-07-17 18:00:00', '2005-07-17 19:00:00',  
      '2005-07-17 23:00:00', '2005-07-18 00:00:00']
df = pd.DataFrame({'a':range(5)}, index=pd.to_datetime(dates))

print (df)
                     a
2005-07-15 17:00:00  0
2005-07-17 18:00:00  1
2005-07-17 19:00:00  2
2005-07-17 23:00:00  3
2005-07-18 00:00:00  4

diff = df.index.to_series().diff().fillna(0)
print (diff)
2005-07-15 17:00:00   0 days 00:00:00
2005-07-17 18:00:00   2 days 01:00:00
2005-07-17 19:00:00   0 days 01:00:00
2005-07-17 23:00:00   0 days 04:00:00
2005-07-18 00:00:00   0 days 01:00:00
dtype: timedelta64[ns]

mask = diff <= pd.Timedelta(1, unit='h')
print (mask)
2005-07-15 17:00:00     True
2005-07-17 18:00:00    False
2005-07-17 19:00:00     True
2005-07-17 23:00:00    False
2005-07-18 00:00:00     True
dtype: bool

df = df[mask]
print (df)
                     a
2005-07-15 17:00:00  0
2005-07-17 19:00:00  2
2005-07-18 00:00:00  4

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 2017-05-18
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2015-05-28
    • 2018-02-06
    相关资源
    最近更新 更多