首页 > 解决方案 > 将 pandas 数据框中的 datetime64[ns] 作为参数传递给函数

问题描述

我正在尝试在数据框中创建一个附加列,以显示两个日期之间的网络天数(不包括自定义假期)。我正在使用一个函数,我试图将df's 列中的日期作为参数传递给该函数,但我无法使其工作。

下面是我的代码(我在给定的集合中使用了两个虚构的假期):

from networkdays import networkdays
import datetime as dt
import numpy as np
import pandas as pd

public_holidays_list = [dt.date(2021, 1, 6), dt.date(2021, 1, 7)]
public_holidays = set(public_holidays_list)

def working_days(start, end, holidays):
    days = networkdays.Networkdays(start, end, holidays)
    working_days = len(days.networkdays())
    return working_days

公式本身工作正常:

print(working_days(dt.date(2021, 1, 4), dt.date(2021, 1, 8), public_holidays))

3

dtypes我正在处理的最小数据框:

d = {'Name': ['A', 'B'], 'Start_Date': [dt.date(2021, 1, 4), dt.date(2021, 1, 11)], 'End_Date': [dt.date(2021, 1, 8), dt.date(2021, 1, 15)]}
df = pd.DataFrame(data = d)
df['Start_Date'] = pd.to_datetime(df['Start_Date'])
df['End_Date'] = pd.to_datetime(df['End_Date'])

当我尝试以下方式时...

df['Working_Days'] = working_days(df['Start_Date'], df['End_Date'])

...我收到一个错误:

AttributeError:“系列”对象没有属性“天”

我也尝试过使用numpy

df['Working_Days'] = np.vectorize(working_days)(df['Start_Date'], df['End_Date'])

我也有一个错误:

AttributeError:“numpy.timedelta64”对象没有属性“天”

你能指出我正确的方向吗?

编辑:我的问题的正确答案是@Kris 的最后一条评论。

重要的!虽然lambda不返回任何错误,但它public_holidays在 2 种情况下正确考虑:

A) public_holidaysare of classdatetime.datedf's dates 的元素属于 class object(我通过pd.to_datetime()从代码中删除行得到这个)。

B) public_holidaysis 类型list(通过 Excel 表格创建public_holidays = df_ph['Date'].tolist()),其元素属于类Timestamp,并且pd.to_datetime()不会从上面的代码中删除行(在 中创建日期df datetime64[ns])。

标签: pythonpandasfunctiondataframedatetime

解决方案


根据我的评论,使用.apply

df['Working_Days'] = df.apply(lambda x: working_days(x.Start_Date, x.End_Date, public_holidays), axis=1)


推荐阅读