如何在 pandas 中按星期几开始按日期时间列分组

How to groupby datetime column by starting day of week in pandas

我有以下数据框:

transaction_date      gp    
2017-01-17         3477.92  
2017-01-18         5839.64  
2017-01-19         5082.19  
2017-01-20         5761.63  
2017-01-21         6705.89  
2017-01-22         9937.17  
2017-01-23         9432.93  
2017-01-24         7965.56  
2017-01-25         8517.26  
2017-01-26         8098.36  
2017-01-27         8947.25  
2017-01-28         8473.38  
2017-01-29         11660.13 
2017-01-30         10266.24 
2017-01-31         4350.21  
2017-02-01         10820.15 
2017-02-02         8554.61  
2017-02-03         10689.69 

我需要按一周的开始日期按 transaction_date 列分组,例如,对于 2017-01-23 到 2017-01-30 之间的所有交易,它应该是 Jan-23 所以基本上我需要一个新列 'first_day_week' 来显示交易发生的那一周的开始日期。

您可以使用 .dt 方法

数据定义

s = pd.Series(data={
'2017-01-17':3477.92,  
'2017-01-18':5839.64,  
'2017-01-19':5082.19,  
'2017-01-20':5761.63,  
'2017-01-21':6705.89,  
'2017-01-22':9937.17,  
'2017-01-23':9432.93,  
'2017-01-24':7965.56,  
'2017-01-25':8517.26,  
'2017-01-26':8098.36,  
'2017-01-27':8947.25,}  )
transaction_date = pd.Series(pd.to_datetime(s.index))

获取一周的开始

start_of_week = transaction_date - pd.to_timedelta(transaction_date.dt.weekday, unit='D')
start_of_week

Returns

0    2017-01-16
1    2017-01-16
2    2017-01-16
3    2017-01-16
4    2017-01-16
5    2017-01-16
6    2017-01-23
7    2017-01-23
8    2017-01-23
9    2017-01-23
10   2017-01-23

这可以分配给周开始列

正在格式化

如果格式很重要,您可以添加

start_of_week = start_of_week.dt.strftime('%b-%d')

首先,您可以将日期时间系列对象转换为具有所需每周频率的周期对象。访问它的 start_time 属性以获取每周的开始日期。由于我们操作的是一个系列对象,每次执行 datetime 相关操作时,请记住提供 .dt 访问器。

df.assign(first_day_week=
          df['transaction_date'].dt.to_period('W').dt.start_time.dt.strftime("%b-%d"))