我有一个 pandas 数据框 df
,日期为字符串:
Date1 Date2
2017-08-31 1970-01-01 17:35:00
2017-10-31 1970-01-01 15:00:00
2017-11-30 1970-01-01 16:30:00
2017-10-31 1970-01-01 16:00:00
2017-10-31 1970-01-01 16:12:00
我想要做的是将 Date2
列中的每个日期部分替换为 Date1
中的相应日期,但保持时间不变,因此输出为:
Date1 Date2
2017-08-31 2017-08-31 17:35:00
2017-10-31 2017-10-31 15:00:00
2017-11-30 2017-11-30 16:30:00
2017-10-31 2017-10-31 16:00:00
2017-10-31 2017-10-31 16:12:00
我已经使用 pandas replace
和正则表达式实现了这一点
import re
date_reg = re.compile(r"([0-9]{4}\-[0-9]{2}\-[0-9]{2})")
df['Market Close Time'].replace(to_replace=date_reg, value=df['Date1'], inplace=True)
但对于只有 15 万行的数据帧,此方法非常慢(>10 分钟)。
解决方案来自 this post实现了更快的 numpy np.where
- 我如何在这个例子中使用 np.where
,或者是否有另一种更有效的方法来执行此操作?
最佳答案
一个想法是:
df['Date3'] = ['{} {}'.format(a, b.split()[1]) for a, b in zip(df['Date1'], df['Date2'])]
或者:
df['Date3'] = df['Date1'] + ' ' + df['Date2'].str.split().str[1]
print (df)
Date1 Date2 Date3
0 2017-08-31 1970-01-01 17:35:00 2017-08-31 17:35:00
1 2017-10-31 1970-01-01 15:00:00 2017-10-31 15:00:00
2 2017-11-30 1970-01-01 16:30:00 2017-11-30 16:30:00
3 2017-10-31 1970-01-01 16:00:00 2017-10-31 16:00:00
4 2017-10-31 1970-01-01 16:12:00 2017-10-31 16:12:00
或者:
df['Date3'] = pd.to_datetime(df['Date1']) + pd.to_timedelta(df['Date2'].str.split().str[1])
print (df)
Date1 Date2 Date3
0 2017-08-31 1970-01-01 17:35:00 2017-08-31 17:35:00
1 2017-10-31 1970-01-01 15:00:00 2017-10-31 15:00:00
2 2017-11-30 1970-01-01 16:30:00 2017-11-30 16:30:00
3 2017-10-31 1970-01-01 16:00:00 2017-10-31 16:00:00
4 2017-10-31 1970-01-01 16:12:00 2017-10-31 16:12:00
时间:
In [302]: %timeit df['Date3'] = ['{} {}'.format(a, b.split()[1]) for a, b in zip(df['Date1'], df['Date2'])]
30.2 ms ± 137 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [303]: %timeit df['Date3'] = df['Date1'] + ' ' + df['Date2'].str.split().str[1]
66.4 ms ± 3.18 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
关于python - 使用正则表达式有效地将一列中的部分值替换为 pandas 中另一列中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583265/