Python pandas:函数等价于SQL';s datediff()?

Python pandas:函数等价于SQL';s datediff()?,python,pandas,datediff,Python,Pandas,Datediff,Python的pandas中是否有与SQL的datediff函数等价的函数? 这个问题的答案是: 解释如何以天为单位计算差异。例如: >>> (pd.to_datetime('15-10-2010') - pd.to_datetime('15-07-2010')) / pd.offsets.Day(1) 92.0 不过,我有两个问题: 有没有办法以月为单位计算差额?我可以近似地将上面的结果除以30,再除以31,但我想知道是否有一些内置函数可以自动完成这项工作 pd.offse

Python的pandas中是否有与SQL的datediff函数等价的函数? 这个问题的答案是: 解释如何以天为单位计算差异。例如:

>>> (pd.to_datetime('15-10-2010') - pd.to_datetime('15-07-2010')) / pd.offsets.Day(1)
92.0
不过,我有两个问题:

  • 有没有办法以月为单位计算差额?我可以近似地将上面的结果除以30,再除以31,但我想知道是否有一些内置函数可以自动完成这项工作
  • pd.offset的语法是什么?我试着除以pd.offsets.Month(1),但它不起作用。我在这里查阅了文档(这很糟糕,就像所有Python文档一样!):但是Day()不在那里,所以我很困惑

  • 更新:

    def months_between(d1, d2):
        dd1 = min(d1, d2)
        dd2 = max(d1, d2)
        return (dd2.year - dd1.year)*12 + dd2.month - dd1.month
    
    In [125]: months_between(pd.to_datetime('2015-01-02 12:13:14'), pd.to_datetime('2012-03-02 12:13:14'))
    Out[125]: 34
    
    In [40]: (pd.to_datetime('15-10-2010') - pd.to_datetime('15-07-2010')).days
    Out[40]: 92
    
    旧答案:

    def months_between(d1, d2):
        dd1 = min(d1, d2)
        dd2 = max(d1, d2)
        return (dd2.year - dd1.year)*12 + dd2.month - dd1.month
    
    In [125]: months_between(pd.to_datetime('2015-01-02 12:13:14'), pd.to_datetime('2012-03-02 12:13:14'))
    Out[125]: 34
    
    In [40]: (pd.to_datetime('15-10-2010') - pd.to_datetime('15-07-2010')).days
    Out[40]: 92
    
    您也可以这样做几个月:

    In [48]: pd.to_datetime('15-10-2010').month - pd.to_datetime('15-07-2010').month
    Out[48]: 3
    

    如果你环顾四周,几个月似乎不可能脱离时间差:

    In [193]: date_1 = pd.to_datetime('2015-01-02 12:13:14')
    
    In [194]: date_2 = pd.to_datetime('2012-03-02 12:13:14')
    
    In [195]: date_1 - date_2
    Out[195]: Timedelta('1036 days 00:00:00')
    
    In [199]: td_1.
    td_1.asm8            td_1.days            td_1.freq            td_1.microseconds    td_1.resolution      td_1.to_pytimedelta  td_1.value           
    td_1.ceil            td_1.delta           td_1.is_populated    td_1.min             td_1.round           td_1.to_timedelta64  td_1.view            
    td_1.components      td_1.floor           td_1.max             td_1.nanoseconds     td_1.seconds         td_1.total_seconds
    
    In [199]: td_1.components
    Out[199]: Components(days=1036, hours=0, minutes=0, seconds=0, milliseconds=0, microseconds=0, nanoseconds=0)
    
    此外,
    组件
    似乎没有提供相同价值的不同面额,但

    In [213]: td_1.components.days
    Out[213]: 1036
    
    In [214]: td_1.components.hours
    Out[214]: 0
    
    最终,您目前所做的似乎是“最佳”解决方案:

    In [214]: td_1.components.days/30
    Out[214]: 34.53333333333333
    
    In [215]: np.round(td_1.components.days/30)
    Out[215]: 35.0
    
    In [216]: np.floor(td_1.components.days/30)
    Out[216]: 34.0
    
    这并不是什么好消息,但无论如何都是一个解决方案


    至于将Matlab附带的文档与pandas的文档进行比较,您是对的。但是,如果你也比较一下这两种产品的价格标签,也许可以回答一些问题。。(?)

    Super!谢谢!我是超级笨拙还是熊猫文档真的很糟糕?事实上,否:这在不同的年份不起作用,例如以下仍然返回3:pd.to_datetime('15-10-2015')。month-pd.to_datetime('15-07-2010')。month这可能是因为您只使用了
    .month
    属性,没有真正考虑到这两个日期之间有几年的时间。@maxU和Matlab的一样,但是它的文档绝对出色。我从来不用花很多时间去寻找基本问题的答案;时间就是金钱,如果Matlab在处理非数字数据方面和熊猫一样优秀,那么许可证的成本就可以自己支付了already@Pythonistaanonymous,我已经更新了我的答案-请检查,我似乎无法将结果转换为整数。有什么想法吗?嗯,我在这里找到了如何从timedelta转换为float:除以np.timedelta64(1,'D')。为什么,以及记录在哪里,是不同的问题!!!当然,但我的观点是,在一个商业环境中,时间就是金钱,而一个缺乏文件证明的产品的“免费”价格是一种虚假的经济。我刚刚浪费了大约一个小时想弄清楚如何减去日期。如果有一个商业软件大致上具备熊猫的功能和Matlab的文档质量,我会立刻购买它