如何快速将字符串日期时间的 NumpyArray 与 Numpy.Where() 函数内的日期时间变量对应

问题描述 投票:0回答:1

程序员们好,
我有这个程序,我需要对大数据集进行排序。 该数据集包含以下列:

连续剧 信息_日期 登录_日期
SNXXXXXX 2023年10月12日12:50 2023/12/14 14:30
SNXXXXXX1 2024年2月29日13:40 2024年2月10日10:00
SNXXXXXX4 日期无效

我需要做的是检查Info_DateLogin_date是否包含字符串

'Invalid date'
,或者检查Info_Date是否超过三个月或者Login_Date是否超过三十天。
在第一种情况下,我使用了 numpy.where() 并且没有遇到问题,因为数据已经是
string
格式,但在其他情况下,我遇到了一个大问题,因为 NumpyArray 的每个元素是一个字符串,它不能面对 numpy.where() 中的日期时间值。
这是我在第一个对抗场景中使用的代码:

import pandas as pd
from datetime import datetime, timedelta
import time
import numpy as np
source_data = pd.read_excel("./documents/data.xlsx")


three_months_ago = datetime.now() - timedelta(days=90)
thirty_days_ago = datetime.now() - timedelta(days=30)



#Get the values that are "Invalid date"
print(source_data.iloc[
    np.where(source_data["Login_Date"].values == "Invalid date")])

我尝试使用

datetime
函数将数据转换为
strptime()
格式,如下所示:

format = str("%d/%m/%Y %H:%M")
print(np.where(datetime.strptime(source_data["Login_Date"], format) < thirty_days_ago))

预期输出应该是:

连续剧 信息_日期 登录_日期
SNXXXXXX1 2024年2月29日13:40 2024年2月10日10:00
python pandas numpy datetime
1个回答
0
投票

将原始日期保留为字符串并复制为日期时间:

# create a copy of the date columns as datetime
tmp = df[['Info_Date', 'Login_Date']].apply(pd.to_datetime,
                                            dayfirst=True, errors='coerce')

today = pd.Timestamp('today')
# Timestamp('2024-03-14 01:23:45.678900')

# is either date invalid?
m1 = df[['Info_Date', 'Login_Date']].eq('Invalid date').any(axis=1)
# is Info_Date older than 3 months?
m2 = tmp['Info_Date'].lt(today-pd.DateOffset(months=3))
# is Login_Date older than 30 days?
m3 = tmp['Login_Date'].rsub(today).gt('30D')

df[['m1', 'm2', 'm3']] = m1, m2, m3

输出:

    Serials         Info_Date        Login_Date     m1     m2     m3
0  SNXXXXXX  10/12/2023 12:50  14/12/2023 14:30  False  False   True
1  SNXXXXX1  29/02/2024 13:40  10/02/2024 10:00   True  False  False
2  SNXXXXX4               NaN      Invalid date   True   True  False
© www.soinside.com 2019 - 2024. All rights reserved.