python - 将 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_holidays
are of classdatetime.date
和df
's dates 的元素属于 class object
(我通过pd.to_datetime()
从代码中删除行得到这个)。
B) public_holidays
is 类型list
(通过 Excel 表格创建public_holidays = df_ph['Date'].tolist()
),其元素属于类Timestamp
,并且pd.to_datetime()
不会从上面的代码中删除行(在 中创建日期df
datetime64[ns]
)。
解决方案
根据我的评论,使用.apply
:
df['Working_Days'] = df.apply(lambda x: working_days(x.Start_Date, x.End_Date, public_holidays), axis=1)
推荐阅读
- web-component - Lit-Element:如何设置全局/重置 css
- typescript - 为什么这个打字稿重载示例不起作用
- java - 有什么比从 modbus 串口读取数据、关闭或保持连接打开更好的方法
- bash - 在匹配字典中包含的值的模式后检索整个字典的脚本
- database - PowerBI (DAX) - Countif 包含列值(千行)
- javascript - 我想在 id=twork 中显示添加文本框 id=ttlpw 和 id=tplpw。但它不起作用
- java - 在没有运行 JBoss 实例的情况下使用 Weld 模拟类
- android - 如何将 java 客户端连接到在 android 中运行的 gRPC 服务器?
- .net - 如何使用已经转义的路径段指定新的 Uri 实例?
- stripe-payments - 更新订阅时的 SCA 身份验证