Python 如何在函数中将参数声明为datetime64?

Python 如何在函数中将参数声明为datetime64?,python,pandas,function,datetime,Python,Pandas,Function,Datetime,我正在尝试应用下一个函数,其中两个数据帧列是参数: import datetime import pandas as pd def set_dif_months_na(start_date, end_date): if (pd.isnull(start_date) and pd.notnull(end_date)): return None elif (pd.notnull(start_date) and pd.isnull(end_date)):

我正在尝试应用下一个函数,其中两个数据帧列是参数:

import datetime
import pandas as pd

def set_dif_months_na(start_date, end_date):
    if (pd.isnull(start_date) and pd.notnull(end_date)):
        return None
    elif (pd.notnull(start_date) and pd.isnull(end_date)):
        return None
    elif (pd.isnull(start_date) and pd.isnull(end_date)):
        return None
    else:
        start_date = datetime.strptime(start_date, "%d/%m/%Y")
        end_date = datetime.strptime(end_date, "%d/%m/%Y")
    return abs((end_date.year - start_date.year) * 12 + (end_date.month - start_date.month))
此函数用于在给定两个日期作为参数的情况下,以整数形式获取月差,否则必须返回
None

当我将其应用于新的数据帧列时,如下所示:

df['new_col'] = [set_dif_months_na(date1, date2)
                                          for date1,date2 in 
                                          zip(df['date1'], df['date2'])]
出现下一个错误:

TypeError:strTime()参数1必须是str,而不是Timestamp


如何调整该函数以将其正确应用于新的pandas数据帧列?

您可以看到,
pandas
使用
numpy
解析日期,并且
numpy.datetime64
与您尝试使用的
datetime.datetime
不直接兼容

有两种不同的解决方案,但是如果您想使用
datetime
,在我看来,这更具可读性,您可以这样做。首先,我们定义一个函数在两种数据类型之间进行转换(从中获得):

然后,您可以通过将功能从以下位置更改为所需:

start_date = datetime.strptime(start_date, "%d/%m/%Y")
end_date = datetime.strptime(end_date, "%d/%m/%Y")

这应该行得通。不过,我可能会给你一些额外的建议。首先,您可以使用
逻辑运算符将所有
if
elif
更改为一个:

if pd.isnull(start_date) or pd.isnull(end_date):
    return None
else:
    start_date = numpy2datetime(start_date)
    end_date = numpy2datetime(end_date)
    return abs((end_date.year - start_date.year) * 12 + (end_date.month - start_date.month))
最后一个是关于你对清单的理解。您根本不需要
zip
,因为这两列都在同一个数据帧中。您可以简单地执行以下操作:

df['new_col'] = [set_dif_months_na(date1, date2)
                                          for date1,date2 in 
                                          df[['date1','date2']].values]
不知道它是否更快,但至少更清晰


希望有用。如果您还有任何问题,请告诉我们。

您知道,
pandas
使用
numpy
解析日期,并且
numpy.datetime64
与您尝试使用的
datetime.datetime
不直接兼容

有两种不同的解决方案,但是如果您想使用
datetime
,在我看来,这更具可读性,您可以这样做。首先,我们定义一个函数在两种数据类型之间进行转换(从中获得):

然后,您可以通过将功能从以下位置更改为所需:

start_date = datetime.strptime(start_date, "%d/%m/%Y")
end_date = datetime.strptime(end_date, "%d/%m/%Y")

这应该行得通。不过,我可能会给你一些额外的建议。首先,您可以使用
逻辑运算符将所有
if
elif
更改为一个:

if pd.isnull(start_date) or pd.isnull(end_date):
    return None
else:
    start_date = numpy2datetime(start_date)
    end_date = numpy2datetime(end_date)
    return abs((end_date.year - start_date.year) * 12 + (end_date.month - start_date.month))
最后一个是关于你对清单的理解。您根本不需要
zip
,因为这两列都在同一个数据帧中。您可以简单地执行以下操作:

df['new_col'] = [set_dif_months_na(date1, date2)
                                          for date1,date2 in 
                                          df[['date1','date2']].values]
不知道它是否更快,但至少更清晰


希望有用。如果您有任何其他问题,请告诉我们。

通过将
开始日期
结束日期
设置从
strtime
更改为
pd。更改为\u datetime
该函数工作时没有任何错误:


def set_dif_months_na(start_date, end_date):
    if (pd.isnull(start_date) and pd.notnull(end_date)):
        return None
    elif (pd.notnull(start_date) and pd.isnull(end_date)):
        return None
    elif (pd.isnull(start_date) and pd.isnull(end_date)):
        return None
    else:
        start_date = pd.to_datetime(start_date,  format="%d/%m/%Y")
        end_date = pd.to_datetime(end_date, format="%d/%m/%Y")
    return abs((end_date.year - start_date.year) * 12 + (end_date.month - start_date.month))

通过将
start_date
end_date
设置从
strtime
更改为
pd.\u datetime
功能正常工作:


def set_dif_months_na(start_date, end_date):
    if (pd.isnull(start_date) and pd.notnull(end_date)):
        return None
    elif (pd.notnull(start_date) and pd.isnull(end_date)):
        return None
    elif (pd.isnull(start_date) and pd.isnull(end_date)):
        return None
    else:
        start_date = pd.to_datetime(start_date,  format="%d/%m/%Y")
        end_date = pd.to_datetime(end_date, format="%d/%m/%Y")
    return abs((end_date.year - start_date.year) * 12 + (end_date.month - start_date.month))

错误显示您已经有了pd.Timestamp,为什么需要strtime呢?若要仅获取日期,请将
.floor('d')
strtime
一起使用。我正在尝试将参数声明为
datetime64
对象,如何将参数正确设置为
datetime64
?您似乎已经拥有该数据类型…是的,列是
datetime64
,但是,函数无法将它们识别为
datetime64
错误告诉您的是
start\u date=datetime.strptime(start\u date,“%d/%m/%Y”)
没有意义,因为
start\u date
已经是datetime64/pd.Timestamp。错误表明您已经有了pd.Timestamp,为什么需要strptime?若要仅获取日期,请将
.floor('d')
strtime
一起使用。我正在尝试将参数声明为
datetime64
对象,如何将参数正确设置为
datetime64
?您似乎已经拥有该数据类型…是的,列是
datetime64
,但是,函数没有将它们识别为
datetime64
错误告诉您的是
start\u date=datetime.strtime(start\u date,“%d/%m/%Y”)
没有意义,因为
start\u date
已经是datetime64/pd。timestamps可以很好地处理datetime.datetime对象,但我认为这不是重点。OP应该只使用pandas datetime,事实上,错误告诉我他已经这样做了。我只是尝试按照OP的思路,将日期转换为
datetime
,然后以月为单位计算差值。请随意推荐一个使用纯熊猫的解决方案,这确实会更有效。熊猫可以很好地处理datetime.datetime对象,但我认为这不是重点。OP应该只使用pandas datetime,事实上,错误告诉我他已经这样做了。我只是尝试按照OP的思路,将日期转换为
datetime
,然后以月为单位计算差值。请随意建议使用纯熊猫的解决方案,这确实会更有效