【问题标题】:How to determine if two pandas Series are within a given time interval如何确定两个熊猫系列是否在给定的时间间隔内
【发布时间】:2020-10-13 04:58:44
【问题描述】:

我有 2 个 pandas.Series 日期时间数据类型。

第一个系列:['2017-12-31 16:00:00-08:00', '2017-12-31 17:00:00-08:00', '2017-12-31 18:00:00-08:00']

第二辑:['2017-12-31 17:00:00-08:00', None, '2017-12-31 18:00:10-08:00']

我想检查两个系列是否等于以下条件:

  • 将时间与 None 进行比较时,应输出 True
  • 比较两个时间时,它们的间隔必须在 10 分钟内。否则输出False

预期输出:[False, True, True]

def date_check(x, y):
    return (np.abs(x - y)) > timedelta(minutes=10)

遇到错误:unsupported operand type(s) for -: 'DatetimeIndex' and 'NoneType'

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:
    • 如果pandas.Series已经转换为datetime格式,它们将不包含None,它们将包含NaT,这让我想到,Series没有格式化为datetime对象。
    • 给定一个带有两列日期的 pandas.DataFrame
    • 将列转换为日期时间,使用pandas.to_datetime
    • .fillna 在列 b 上,这将确保时差
    • 如果两列都是None,则填写pandas.Timedelta(0)
    import pandas as pd
    import numpy as np
    from datetime import timedelta
    
    a = ['2017-12-31 16:00:00-08:00', '2017-12-31 17:00:00-08:00', '2017-12-31 18:00:00-08:00', None]
    b = ['2017-12-31 17:00:00-08:00', None, '2017-12-31 18:00:10-08:00', None]
    
    # dataframe
    df = pd.DataFrame({'a': a, 'b': b})
    
    # convert columns to datetime format
    df[['a', 'b']] = df[['a', 'b']].apply(pd.to_datetime)
    
                              a                         b
    0 2017-12-31 16:00:00-08:00 2017-12-31 17:00:00-08:00
    1 2017-12-31 17:00:00-08:00                       NaT
    2 2017-12-31 18:00:00-08:00 2017-12-31 18:00:10-08:00
    3                       NaT                       NaT
    
    # fillna in column b with values from column a
    df.b = df.b.fillna(df.a)
    
    # if both columns are None, fillna with Timedelta(0)
    df[['a', 'b']] = df[['a', 'b']].fillna(pd.Timedelta(0))
    
                               a                          b
    0  2017-12-31 16:00:00-08:00  2017-12-31 17:00:00-08:00
    1  2017-12-31 17:00:00-08:00  2017-12-31 17:00:00-08:00
    2  2017-12-31 18:00:00-08:00  2017-12-31 18:00:10-08:00
    3            0 days 00:00:00            0 days 00:00:00
    
    # function
    def date_check(x, y):
        return (np.abs(x - y)) < timedelta(minutes=10)
    
    
    # function call
    date_check(df.a, df.b)
    [out]:
    0    False
    1     True
    2     True
    3     True
    dtype: bool
    
    # add a column to the dataframe
    df['time_diff'] = np.abs(df.a - df.b) < pd.Timedelta(minutes=10)
    
                               a                          b  time_diff
    0  2017-12-31 16:00:00-08:00  2017-12-31 17:00:00-08:00      False
    1  2017-12-31 17:00:00-08:00  2017-12-31 17:00:00-08:00       True
    2  2017-12-31 18:00:00-08:00  2017-12-31 18:00:10-08:00       True
    3            0 days 00:00:00            0 days 00:00:00       True
    

    【讨论】:

      【解决方案2】:

      它无法对NoneTypes 执行操作,因此只需使用 try/except 块单独处理即可。

      def date_check(x, y):
          try:
              return (np.abs(x - y)) > timedelta(minutes=10)
          except:
              return True
      

      【讨论】:

        猜你喜欢
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        相关资源
        最近更新 更多