【问题标题】:Integer to date in Python: unsupported type for timedelta days component: SeriesPython中的整数日期:timedelta天组件不支持的类型:系列
【发布时间】:2021-03-24 05:59:57
【问题描述】:

我想在数据框事务中从 DAY 列创建一个新列 DATE(列出研究开始后的天数)。比如,如果 DAY 是 1,我希望 DATE 显示 2014-1-1,或者如果 DAY 是 12,它应该是 2014-1-12。这就是我正在做的将日期转换为日期的工作:

import datetime
def serial_date_to_string(srl_no):
    new_date = datetime.datetime(2014,1,1,0,0) + datetime.timedelta(srl_no - 1)
    return new_date.strftime("%Y-%m-%d")

但是,当我尝试使用此公式添加新列时,它不起作用:

transaction['DATE'] = serial_date_to_string(transaction['DAY'])

TypeError:timedelta days 组件的类型不受支持:系列

但是 DAY 列类型是 int64。我尝试在论坛上搜索,发现公式可以调整,如果我尝试使用这个:

def serial_date_to_string(srl_no):
    new_date = datetime.datetime(2014,1,1,0,0) + (srl_no - 1).map(datetime.timedelta)
    return new_date.strftime("%Y-%m-%d")

它仍然给出 AttributeError: 'Series' object has no attribute 'strftime'

感谢您的帮助!

【问题讨论】:

    标签: python pandas date datetime


    【解决方案1】:

    使用map

    transaction['DATE'] = transaction['DAY'].map(serial_date_to_string)
    

    【讨论】:

      【解决方案2】:

      使用带有参数originto_datetimeunit=ddays

      df = pd.DataFrame({'DAY':[1,12,20]})
      
      df['date'] = pd.to_datetime(df['DAY'] - 1, origin='2014-01-01', unit='d')
      print (df)
         DAY       date
      0    1 2014-01-01
      1   12 2014-01-12
      2   20 2014-01-20
      

      对于相同的输出添加Series.dt.strftime:

      df['date'] = pd.to_datetime(df['DAY'] - 1, origin='2014-01-01', unit='d').dt.strftime("%Y-%m-%d")
      print (df)
         DAY        date
      0    1  2014-01-01
      1   12  2014-01-12
      2   20  2014-01-20
      

      编辑:

      对于您的功能可以使用Series.apply:

      transaction['DATE'] = transaction['DAY'].apply(serial_date_to_string)
      

      性能类似,apply 这里对于 10k 行是最快的:

      import datetime
      def serial_date_to_string(srl_no):
          new_date = datetime.datetime(2014,1,1,0,0) + datetime.timedelta(srl_no - 1)
          return new_date.strftime("%Y-%m-%d")
          
      
      np.random.seed(2021)
      df = pd.DataFrame({'DAY': np.random.randint(10, 1000, size=10000)})
      

      In [17]: %timeit pd.to_datetime(df['DAY'] - 1, origin='2014-01-01', unit='d').dt.strftime("%Y-%m-%d")
      79.4 ms ± 1.18 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
      
      In [18]: %timeit df['DAY'].apply(serial_date_to_string)
      57.1 ms ± 110 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
      
      In [19]: %timeit df['DAY'].map(serial_date_to_string)
      64.7 ms ± 5.83 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
      

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 1970-01-01
        • 2022-12-05
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多