Pandas 给定一个日期时两个日期之间的月数 输入测向

Pandas 给定一个日期时两个日期之间的月数 输入测向,pandas,Pandas,注意:Date1的类型是datetime64[ns] 球门 我想计算Date1列和'2019-01-01'之间的月差 试一试 我尝试了下面的答案,但失败如下: df['Date1'].dt.to_period('M') - pd.to_datetime('2019-01-01').to_period('M') 注:熊猫版本:1.1.5 我认为这应该有效: date_ref = pd.to_datetime('2019-01-01') df["mo_since_2019_01&qu

注意:
Date1
的类型是
datetime64[ns]

球门 我想计算Date1列和
'2019-01-01'
之间的月差

试一试 我尝试了下面的答案,但失败如下:

df['Date1'].dt.to_period('M') - pd.to_datetime('2019-01-01').to_period('M') 
  • 注:熊猫版本:1.1.5

    • 我认为这应该有效:

      date_ref = pd.to_datetime('2019-01-01')
      df["mo_since_2019_01"] = (df.Date1.dt.year - date_ref.year).values*12 + (df.Date1.dt.month - date_ref.month)
      
      month_delta = (date2.year - date1.year)*12 + (date2.month - date1.month)
      
      输出:

             Date1  mo_since_2019_01
      0 2019-01-23                 0
      1 2020-02-01                13
      
      尝试:

      输入:

              Date1
      0  2019-01-23
      1  2020-02-01
      2  2020-05-01
      3  2020-06-01
      
      输出:

             Date1  Diff
      0 2019-01-23     0
      1 2020-02-01    13
      2 2020-05-01    16
      3 2020-06-01    17
      

      使用此解决方案,您不需要进一步导入,因为它只计算固定开始日期和可变结束日期之间的
      pd.date\u range()
      长度:

      def relative_months(start, end, freq="M"):
          if start < end:
              x = len(pd.date_range(start=start,end=end,freq=freq))
          else:
              x = - len(pd.date_range(start=end,end=start,freq=freq))
          return x
      
      start = pd.to_datetime("2019-01-01")
      df['relative_months'] = df['Date1'].apply(lambda end: relative_months(start, end, freq="M"))
      
      定义相对月份(开始、结束、频率=“M”): 如果开始<结束: x=长度(局部放电日期\范围(开始=开始,结束=结束,频率=频率)) 其他: x=-len(局部放电日期\范围(开始=结束,结束=开始,频率=频率)) 返回x 开始时间=截止日期时间(“2019-01-01”) df['relative_months']=df['Date1']。应用(lambda end:relative_months(start,end,freq=“M”))
      就你的具体情况而言,我认为应该是最快/有利的;然而,我的变体允许使用for date offset,如
      'M'
      'D'
      ,…并允许您专门处理“负”相对偏移的边缘情况(即,如果您的比较日期不早于
      Date1
      中的所有日期,会发生什么情况).

      您的解决方案应通过将句点转换为整数来更改,第二个值使用一个元素列表
      ['2019-01-01']

      df['new'] = (df['Date1'].dt.to_period('M').astype(int) - 
                   pd.to_datetime(['2019-01-01']).to_period('M').astype(int))
      print (df)
             Date1  new
      0 2019-01-23    0
      1 2020-02-01   13
      
      如果比较解决方案:

      rng = pd.date_range('1900-04-03', periods=3000, freq='MS')
      df = pd.DataFrame({'Date1': rng})  
      
      
      In [106]: %%timeit
           ...: date_ref = pd.to_datetime('2019-01-01')
           ...: df["mo_since_2019_01"] = (df.Date1.dt.year - date_ref.year).values*12 + (df.Date1.dt.month - date_ref.month)
           ...: 
      1.57 ms ± 8.18 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      
      In [107]: %%timeit
           ...: df['new'] = (df['Date1'].dt.to_period('M').astype(int) - pd.to_datetime(['2019-01-01']).to_period('M').astype(int))
           ...: 
      1.32 ms ± 19.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
          
      
      发动机罩下有环,因此速度较慢:

      In [109]: %%timeit
           ...: start = pd.to_datetime("2019-01-01")
           ...: df['relative_months'] = df['Date1'].apply(lambda end: relative_months(start, end, freq="M"))
           ...: 
      25.7 s ± 729 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
      
      In [110]: %%timeit
           ...: rd = df['Date1'].apply(lambda x:relativedelta(x,date(2019,1,1)))
           ...: mon = rd.apply(lambda x: ((x.years * 12) + x.months))
           ...: df['Diff'] = mon
           ...: 
      94.2 ms ± 431 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
          
      

      您是否将
      Date1
      转换为带有
      pd.to_datetime()
      的实际日期类型?@PauloMarques无需,请参阅我的更新。@Jack-所以您想忽略年份,只计算月差?例如,2020-02-01和2019-01-01之间的月差为“1”?@Sharathnanaraj否,它必须结束年份。例如,它将是13。我不理解你的答案,它似乎与我的问题不匹配。更新的解决方案请记住包括必要的导入,我猜:
      来自dateutil.relativedelta导入relativedelta
      来自datetime导入日期
      Tats right@Asmus
      rng = pd.date_range('1900-04-03', periods=3000, freq='MS')
      df = pd.DataFrame({'Date1': rng})  
      
      
      In [106]: %%timeit
           ...: date_ref = pd.to_datetime('2019-01-01')
           ...: df["mo_since_2019_01"] = (df.Date1.dt.year - date_ref.year).values*12 + (df.Date1.dt.month - date_ref.month)
           ...: 
      1.57 ms ± 8.18 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      
      In [107]: %%timeit
           ...: df['new'] = (df['Date1'].dt.to_period('M').astype(int) - pd.to_datetime(['2019-01-01']).to_period('M').astype(int))
           ...: 
      1.32 ms ± 19.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
          
      
      In [109]: %%timeit
           ...: start = pd.to_datetime("2019-01-01")
           ...: df['relative_months'] = df['Date1'].apply(lambda end: relative_months(start, end, freq="M"))
           ...: 
      25.7 s ± 729 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
      
      In [110]: %%timeit
           ...: rd = df['Date1'].apply(lambda x:relativedelta(x,date(2019,1,1)))
           ...: mon = rd.apply(lambda x: ((x.years * 12) + x.months))
           ...: df['Diff'] = mon
           ...: 
      94.2 ms ± 431 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)