繁体   English   中英

如何确定两个熊猫系列是否在给定的时间间隔内

[英]How to determine if two pandas Series are within a given time interval

我有 2 pandas.Series带有日期时间数据类型的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'

  • 如果pandas.Series已转换为datetime格式,它们将不包含None ,它们将包含NaT ,这让我想到, Series未格式化为datetime对象。
  • 给定一个带有两列日期的pandas.DataFrame
  • 使用pandas.to_datetime将列转换为日期pandas.to_datetime
  • .fillnab列上,这将确保时间差 < 10 分钟
  • 如果两列都是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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM