簡體   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