虽然
@knightofni和
@Paul的解决方案都可以工作,但我倾向于避免在Pandas中使用apply,因为它通常比基于数组的方法慢得多。为了避免这种情况,在将列转换为日期时间列(通过
pd.to_datetime
)后,我们可以修改基于工作日的方法,并将星期几简单地转换为
numpy timedelta64[D],方法是直接进行类型转换:
df['week_start'] = df['myday'] - df['myday'].dt.weekday.astype('timedelta64[D]')
或者使用 to_timedelta,就像 @ribitskiyb 建议的那样:
df['week_start'] = df['myday'] - pd.to_timedelta(df['myday'].dt.weekday, unit='D').
使用包含60,000个日期时间的测试数据,我使用新发布的Pandas 1.0.1版本并按照建议的答案得到了以下时间。
>>> 1.33 s ± 28.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> 5.59 ms ± 138 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> 3.44 ms ± 106 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> 3.47 ms ± 170 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
这些结果显示,Pandas 1.0.1极大地提高了基于to_period apply方法的速度(相对于Pandas <= 0.25),但是直接转换为时间差(通过将类型直接转换为.astype('timedelta64[D]')或使用pd.to_timedelta)仍然更优。根据这些结果,建议今后使用pd.to_timedelta。
df['myday'].dt.to_period('W').dt.start_time
可能比使用apply
更快(不确定这是从哪个 pandas 版本开始引入的,可能不适用于旧版本)。 - Ryan Tam'W-SUN'
,以星期四为开始日期的偏移量是'W-THU'
。 - Henry Ecker