将 datetime64[ns] 转换为该周的给定日期的最有效方法?

Most efficient way to convert datetime64[ns] to a given day of that week?

将 pandas 数据框日期列转换为 'week beginning' 列的最有效方法是什么?就我而言,我想转换为该周的星期日。比如我想把2016-04-01转换成2016-03-27.

您可以在索引上使用 to_period('W') 转换并在上周使用它的偏移量

In [56]: ts
Out[56]:
2016-04-01   -1.174966
2016-04-02   -0.518799
2016-04-03   -0.598929
2016-04-04    0.085304
2016-04-05   -0.648838
2016-04-06   -0.427322
2016-04-07    0.146146
2016-04-08   -1.957471
2016-04-09   -0.302514
2016-04-10    1.249215
Freq: D, dtype: float64

In [57]: ts.index.to_period('W').to_timestamp('W') + pd.offsets.DateOffset(-7)
Out[57]:
DatetimeIndex(['2016-03-27', '2016-03-27', '2016-03-27', '2016-04-03',
               '2016-04-03', '2016-04-03', '2016-04-03', '2016-04-03',
               '2016-04-03', '2016-04-03'],
              dtype='datetime64[ns]', freq=None)

如果你有像

这样的日期列
In [90]: ds
Out[90]:
        date       val
0 2016-04-01  0.087695
1 2016-04-02 -0.163535
2 2016-04-03 -1.069274
3 2016-04-04  1.415452
4 2016-04-05 -1.100268
5 2016-04-06  0.239589
6 2016-04-07 -1.045833
7 2016-04-08 -0.325026
8 2016-04-09 -0.423831
9 2016-04-10 -1.320371

您可以使用 dt - 系列值的 datetimelike 属性的访问器对象。

In [91]: ds['date'].dt.to_period('W').dt.to_timestamp('W') + pd.offsets.DateOffset(-7)
Out[91]:
DatetimeIndex(['2016-03-27', '2016-03-27', '2016-03-27', '2016-04-03',
               '2016-04-03', '2016-04-03', '2016-04-03', '2016-04-03',
               '2016-04-03', '2016-04-03'],
              dtype='datetime64[ns]', freq=None)

您可以查看此 post 并在此处应用:Find the Friday of previous/last week in python

from dateutil.relativedelta import relativedelta, SU
from datetime import datetime
import pandas as pd

df = pd.DataFrame({'date': [datetime(2016, 4, 1), datetime(2016, 1, 1)]})
relative_delta = relativedelta(weekday=SU(-1))
df['date'] = df['date'].apply(lambda x: x+relative_delta)

使用to_period("W-SAT")转换为周期序列,然后使用start_time获取周期的开始时间:

import pandas as pd

di = pd.date_range("2016/01/01", "2016/04/10").to_series()
di.dt.to_period("W-SAT").dt.start_time