如何找到两个日期之间的中位数月份?

时间:2019-01-29 17:43:00

标签: python pandas numpy datetime

我需要找到日期框架中两个日期之间的中间月份值。我通过显示四个示例来简化此情况。

import pandas as pd
import numpy as np
import datetime
df=pd.DataFrame([["1/31/2016","3/1/2016"],
                 ["6/15/2016","7/14/2016"],
                 ["7/14/2016","8/15/2016"], 
                 ["8/7/2016","9/6/2016"]], columns=['FromDate','ToDate'])

df['Month'] = df.ToDate.dt.month-df.FromDate.dt.month

我正在尝试附加一列,但没有得到想要的结果。 我需要查看以下值:[2,6,7,8]

2 个答案:

答案 0 :(得分:3)

您可以通过将两个日期之间的timedelta的一半加上较早的日期来显式计算平均日期。然后只需提取月份:

# convert to datetime if necessary
df[df.columns] = df[df.columns].apply(pd.to_datetime)

# calculate mean date, then extract month
df['Month'] = (df['FromDate'] + (df['ToDate'] - df['FromDate']) / 2).dt.month

print(df)

    FromDate     ToDate  Month
0 2016-01-31 2016-03-01      2
1 2016-06-15 2016-07-14      6
2 2016-07-14 2016-08-15      7
3 2016-08-07 2016-09-06      8

答案 1 :(得分:0)

在使用dt.month之前,您需要将字符串转换为datetime。 此行计算平均月份数:

df['Month']   = (pd.to_datetime(df['ToDate']).dt.month +
                 pd.to_datetime(df['FromDate']).dt.month)//2
print(df)
    FromDate     ToDate  Month
0  1/31/2016   3/1/2016      2
1  6/15/2016  7/14/2016      6
2  7/14/2016  8/15/2016      7
3   8/7/2016   9/6/2016      8

这仅适用于同一年的两个日期。

jpp的解决方案很好,但在某些情况下会给出错误的答案:

[“ 2016年1月1日”,“ 2016年3月1日”]人们会期望2,因为2月在1月至3月之间,但是jpp会给出1对应于1月。