【问题标题】:constructing a date column from a relative time pd.df column从相对时间 pd.df 列构造日期列
【发布时间】:2018-01-25 13:56:07
【问题描述】:

我希望在以下 df 中添加一列“到期”:

In [157]: df
Out[157]: 
     atmVol     t
0  0.043220  0.02
1  0.042139  0.04
2  0.041174  0.06
3  0.040328  0.08
4  0.039606  0.10
5  0.038364  0.15
6  0.037971  0.20
7  0.038480  0.25

试过这个:

df['expiry'] = df.apply(lambda x: datetime.utcnow() + timedelta(x.t * 365)

返回一个 AttributeError: ("'Series' object has no attribute 't'", 'occured at index atmVol')

我在这里做错了什么?感谢您的帮助。

【问题讨论】:

    标签: python pandas datetime python-3.6


    【解决方案1】:

    您可以将Series.apply 用于一列:

    df['expiry'] = df['t'].apply(lambda x: datetime.utcnow() + timedelta(x * 365))
    

    或者通过to_timedeltat列转换为timedeltas:

    df['expiry'] = datetime.utcnow() + pd.to_timedelta(df['t'] * 365, unit='d')
    

    df['expiry1'] = df['t'].apply(lambda x: datetime.utcnow() + timedelta(x * 365))
    df['expiry2'] = datetime.utcnow() + pd.to_timedelta(df['t'] * 365, unit='d')
    print (df)
         atmVol     t                    expiry1                    expiry2
    0  0.043220  0.02 2018-02-01 21:14:02.057250 2018-02-01 21:14:02.057250
    1  0.042139  0.04 2018-02-09 04:26:02.057250 2018-02-09 04:26:02.057250
    2  0.041174  0.06 2018-02-16 11:38:02.057250 2018-02-16 11:38:02.057250
    3  0.040328  0.08 2018-02-23 18:50:02.057250 2018-02-23 18:50:02.057250
    4  0.039606  0.10 2018-03-03 02:02:02.057250 2018-03-03 02:02:02.057250
    5  0.038364  0.15 2018-03-21 08:02:02.057250 2018-03-21 08:02:02.057250
    6  0.037971  0.20 2018-04-08 14:02:02.057250 2018-04-08 14:02:02.057250
    7  0.038480  0.25 2018-04-26 20:02:02.057250 2018-04-26 20:02:02.057250
    

    【讨论】:

    • 两者都工作得很好。令人惊讶的是,应用版本更快。谢谢耶斯瑞尔
    • 是的,我也测试过。我认为因为to_timedelta 也与NaT 一起工作,所以速度较慢。
    • 我得到了这个时间In [308]: %timeit datetime.utcnow() + pd.to_timedelta(df['t'] * 365, unit='d') 1 loop, best of 3: 284 ms per loop In [309]: %timeit df['t'].apply(lambda x: datetime.utcnow() + timedelta(x * 365)) 10 loops, best of 3: 153 ms per loop
    • with 80000 rows by df = pd.concat([df] * 10000, ignore_index=True)
    • 小 df 所以没关系。你的回答一如既往的好
    猜你喜欢
    • 2016-05-21
    • 2012-12-23
    • 2015-05-15
    • 2016-01-21
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2021-12-29
    相关资源
    最近更新 更多