我有一个带有10个日期时间列(main_df
)的DataFrame d_0 ... d_9
。对于某些行,我的日期少于10个,因此我用d0 .. d_X
填充了NaT
。
id d_0 d_1 d_2 d_3 d_4 d_5 d_6 d_7 d_8 d_9
530124 4 2019-05-20 13:49:24 2019-05-29 11:06:30 2019-06-11 19:04:40 2019-06-18 19:40:37 2019-07-09 10:17:05 2019-07-18 17:39:30 2019-08-02 12:35:13 2019-08-13 10:09:59 2019-08-17 16:38:45 2019-08-26 12:07:28
627023 8 NaT NaT NaT 2018-01-03 17:14:42 2018-01-15 16:40:22 2018-01-18 17:28:03 2018-04-23 12:00:27 2018-05-24 17:49:01 2018-06-07 16:41:15 2018-07-22 15:22:48
470303 6 NaT NaT NaT NaT NaT NaT 2017-06-19 14:23:57 2017-10-04 14:25:21 2017-10-11 15:38:28 2017-12-28 18:39:00
我还有一个字典(date_dfs
),它将id
的每个值映射到一个保存所有日期的值的DataFrame。所有这些数据框都有一个DatetimeIndex
和3列,其中包含每个可能日期的值。我的目标是在main_df
和相应的date_df
之间进行联接。因此,对于main_df
中的特定行,我想要一个(10,3)形状数组。我想对main_df
中的每一行执行此操作,以获得(n, 10, 3)
形状的n = len(main_df)
形状数组。
当前,我正在逐行执行此操作,由于我的main_df
大约有50万行,因此需要很长时间。到目前为止,我的代码是这样的:
dt_cols = [f'd_{i}' for i in range(10)]
result = []
for seq_idx in range(len(main_df)):
seq = main_df.iloc[seq_idx]
seq_dt_cols = seq[dt_cols]
# Necessary because `seq_dt_cols` has type `object`
date_series = pd.to_datetime(seq_dt_cols[seq.pad_end:], infer_datetime_format=True)
seq_dates = date_series.dt.date - pd.DateOffset(1)
# pad missing values with -1
pad = np.full(shape=(seq.pad_end, 3), fill_value=-1, dtype=np.float32)
date_vals = self.date_dfs[seq.id].loc[seq_dates].values.astype(np.float32)
result.append(np.concatenate((pad, date_vals)))
return np.stack(result)
我认为每行对pd.to_datetime
的调用是造成如此缓慢的很大原因,但我必须这样做,因为Pandas不会将系列转换为datetime
,甚至尽管所有列的类型均为datetime
。
我可以以某种方式使其更快吗?