如何在 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"))
我有以下数据框:
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"))