【问题标题】:Using datetime timedelta with a series in a pandas DF将 datetime timedelta 与 pandas DF 中的系列一起使用
【发布时间】:2016-05-21 12:40:03
【问题描述】:

我有一个看起来像这样的 pandas sim_df:

现在,我想添加另一列“日期”,即对应于“现在”加上“cum_days”(增量时间)的日期。

start = dt.datetime.now()
sim_df['date'] = start + dt.timedelta(sim_df['cum_days'])

但看起来 deltatime 不使用系列,而是使用固定标量。

TypeError: unsupported type for timedelta days component: Series

有没有办法在向量化操作中解决这个问题,而无需遍历 sim_df 的每一行?

【问题讨论】:

  • cum_days 是什么类型?浮动?

标签: python datetime pandas


【解决方案1】:

这个怎么样?

start = dt.datetime.now()
sim_df['date'] = start + sim_df['cum_days'].map(dt.timedelta)

这会将dt.timedelta 分别应用于cum_days 列的每个元素。

【讨论】:

  • 很棒的pythonic答案。谢谢
  • 有没有办法将时间增量指定为月而不是天? @克里斯
  • @WesleyKitlasten 不明白为什么,你试过了吗?
  • @Kris,我尝试了很多东西。我终于让它工作了: df['date']=pd.to_datetime(simstart)+pd.TimedeltaIndex(df['day'], unit='D') Where simstart = datetime.date(1979,7,2 ) 和 df['day'] 是天数。其次是 df.set_index('date',inplace=True) df.drop(['day'],inplace=True,axis=1)
【解决方案2】:

从您的列中构造一个TimedeltaIndex 并将其添加到标量值:

In [26]:
sim_df = pd.DataFrame({'delta_time_days': [1.02, .09, 1.08, 1.7, 4.1, 0.3, .13, .01, .3, .7], 
                       'cum_days': [1.1, 1.1, 2.2, 3.9, 8.0, 8.3, 8.4, 8.4, 8.8, 9.5]})
start = dt.datetime.now()
sim_df['date'] = start + pd.TimedeltaIndex(sim_df['cum_days'], unit='D')
sim_df

Out[26]:
   cum_days  delta_time_days                       date
0       1.1             1.02 2016-02-12 01:40:32.413413
1       1.1             0.09 2016-02-12 01:40:32.413413
2       2.2             1.08 2016-02-13 04:04:32.413413
3       3.9             1.70 2016-02-14 20:52:32.413413
4       8.0             4.10 2016-02-18 23:16:32.413413
5       8.3             0.30 2016-02-19 06:28:32.413413
6       8.4             0.13 2016-02-19 08:52:32.413413
7       8.4             0.01 2016-02-19 08:52:32.413413
8       8.8             0.30 2016-02-19 18:28:32.413413
9       9.5             0.70 2016-02-20 11:16:32.413413

【讨论】:

    【解决方案3】:

    使用列表推导将 timedelta 添加到现在。

    sim_df = pd.DataFrame({'delta_time_days': [1.02, .09, 1.08, 1.7, 4.1, 0.3, .13, .01, .3, .7], 
                           'cum_days': [1.1, 1.1, 2.2, 3.9, 8.0, 8.3, 8.4, 8.4, 8.8, 9.5]})
    
    sim_df['date'] = [dt.datetime.now() + dt.timedelta(days=d) for d in sim_df.cum_days]
    
    >>> sim_df
       cum_days  delta_time_days                       date
    0       1.1             1.02 2016-02-11 17:36:11.320271
    1       1.1             0.09 2016-02-11 17:36:11.320286
    2       2.2             1.08 2016-02-12 20:00:11.320289
    3       3.9             1.70 2016-02-14 12:48:11.320292
    4       8.0             4.10 2016-02-18 15:12:11.320296
    5       8.3             0.30 2016-02-18 22:24:11.320299
    6       8.4             0.13 2016-02-19 00:48:11.320301
    7       8.4             0.01 2016-02-19 00:48:11.320304
    8       8.8             0.30 2016-02-19 10:24:11.320306
    9       9.5             0.70 2016-02-20 03:12:11.320309
    

    【讨论】:

    • 这是最快的方法
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2021-09-13
    相关资源
    最近更新 更多