Python 熊猫在某个月的两个日期之间有几天

Python 熊猫在某个月的两个日期之间有几天,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有一个带有三列的pandasdataframe。开始和结束日期以及月份 我想添加一个列,说明一个月内两个日期之间有多少天。我开始用apply,calendar库和一些数学工具做一些事情,但它开始变得非常复杂。我打赌熊猫有一个简单的解决方案,但我很难找到 输入: import pandas as pd df1 = pd.DataFrame(data=[['2017-01-01', '2017-06-01', '2016-01-01'], ['20

我有一个带有三列的
pandas
dataframe。开始和结束日期以及月份

我想添加一个列,说明一个月内两个日期之间有多少天。我开始用
apply
calendar
库和一些数学工具做一些事情,但它开始变得非常复杂。我打赌熊猫有一个简单的解决方案,但我很难找到

输入:

import pandas as pd
df1 = pd.DataFrame(data=[['2017-01-01', '2017-06-01', '2016-01-01'],
                         ['2015-03-02', '2016-02-10', '2016-02-01'],
                         ['2011-01-02', '2018-02-10', '2016-03-01']],
                  columns=['start date', 'end date date', 'Month'])
期望输出:

   start date end date date       Month  Days in Month
0  2017-01-01    2017-06-01  2016-01-01              0
1  2015-03-02    2016-02-10  2016-02-01             10
2  2011-01-02    2018-02-10  2016-03-01             31
有一个解决方案: 通过
pd.date\u范围
start
end
日期之间获取日期列表,然后检查有多少日期与目标月份具有相同的
year
month

def overlap(x):
    md = pd.to_datetime(x[2])
    cand =  [(ad.year, ad.month) for ad in pd.date_range(x[0], x[1])]
    return len([x for x in cand if x ==(md.year, md.month)])
df1["Days in Month"]= df1.apply(overlap, axis=1)
您将获得:

   start date end date date       Month  Days in Month
0  2017-01-01    2017-06-01  2016-01-01              0
1  2015-03-02    2016-02-10  2016-02-01             10
2  2011-01-02    2018-02-10  2016-03-01             31
有一个解决方案: 通过
pd.date\u范围
start
end
日期之间获取日期列表,然后检查有多少日期与目标月份具有相同的
year
month

def overlap(x):
    md = pd.to_datetime(x[2])
    cand =  [(ad.year, ad.month) for ad in pd.date_range(x[0], x[1])]
    return len([x for x in cand if x ==(md.year, md.month)])
df1["Days in Month"]= df1.apply(overlap, axis=1)
您将获得:

   start date end date date       Month  Days in Month
0  2017-01-01    2017-06-01  2016-01-01              0
1  2015-03-02    2016-02-10  2016-02-01             10
2  2011-01-02    2018-02-10  2016-03-01             31

您可以通过以下方式将单元格转换为日期时间:

df=df.applymap(lambda x:pd.to_datetime(x))

然后使用函数查找相交天数

def intersectionDaysInMonth(start, end, month):
    end_month = month.replace(month=month.month + 1)
    if month <= start <= end_month:
        return end_month - start
    if month <= end <= end_month:
        return end - month
    if start <= month < end_month <= end:
        return end_month - month

    return pd.to_timedelta(0)

您可以通过以下方式将单元格转换为日期时间:

df=df.applymap(lambda x:pd.to_datetime(x))

然后使用函数查找相交天数

def intersectionDaysInMonth(start, end, month):
    end_month = month.replace(month=month.month + 1)
    if month <= start <= end_month:
        return end_month - start
    if month <= end <= end_month:
        return end - month
    if start <= month < end_month <= end:
        return end_month - month

    return pd.to_timedelta(0)