Pandas: 将日期列剪切为期间日期 groups/bins
Pandas: cut date column into period date groups/bins
我有如下数据框:
df = pd.DataFrame({'Id': ['abs1', 'abs2', 'abs3', 'plo2', '201805', '201806', '202011', 'pctx1'],
'Date': ['2021-06-15', '2021-06-13', '2021-06-07', '2021-05-30',
'2021-05-12', '2021-04-28', '2021-04-15', '2021-02-01']})
我想把日期列分成几组在一个新列中,叫做Date_Bin,规则是:从今天开始,如果日期中的值小于7天,那么值在新列中将是 'last 7 days',如果该值小于 14 天且距今天超过 7 天,则该值为“7 到 14 天”,如果该值小于 30 天且大于 14 days,则值为'14 to 30 days',30 to 60 days,60 to 90 days,超过90 days同理。
理想的输出是这样的:
Id Date Date_Bin
0 abs1 2021-06-15 last 7 days
1 abs2 2021-06-13 last 7 days
2 abs3 2021-06-07 7 to 14 days
3 plo2 2021-05-30 14 to 30 days
4 201805 2021-05-10 30 to 60 days
5 201806 2021-04-28 30 to 60 days
6 202011 2021-04-15 60 to 90 days
7 pctx1 2021-02-01 more than 90 days
如您所见,这些是我唯一需要的 groups/bins 数据。我尝试了几种方法,但没有奏效,如果有人能提供帮助,我将不胜感激。
用 to_datetime
转换你的日期,然后从今天的 normalized
日期中减去(以便我们删除时间部分)并得到天数。然后使用 pd.cut
将它们适当地分组。
未来的任何事情都会被标记为 NaN
。
import pandas as pd
import numpy as np
df['Date'] = pd.to_datetime(df['Date'])
s = (pd.to_datetime('today').normalize() - df['Date']).dt.days
df['Date_Bin'] = pd.cut(s, [0, 7, 14, 30, 60, 90, np.inf],
labels=['last 7 days', '7 to 14 days', '14 to 30 days',
'30 to 60 days', '60 to 90 days', 'more than 90 days'],
include_lowest=True)
print(df)
Id Date Date_Bin
0 abs1 2021-06-15 last 7 days
1 abs2 2021-06-13 last 7 days
2 abs3 2021-06-07 7 to 14 days
3 plo2 2021-05-30 14 to 30 days
4 201805 2021-05-12 30 to 60 days
5 201806 2021-04-28 30 to 60 days
6 202011 2021-04-15 60 to 90 days
7 pctx1 2021-02-01 more than 90 days
为了将来的可重复性,在撰写本文时:
pd.to_datetime('today').normalize()
#Timestamp('2021-06-15 00:00:00')
我有如下数据框:
df = pd.DataFrame({'Id': ['abs1', 'abs2', 'abs3', 'plo2', '201805', '201806', '202011', 'pctx1'],
'Date': ['2021-06-15', '2021-06-13', '2021-06-07', '2021-05-30',
'2021-05-12', '2021-04-28', '2021-04-15', '2021-02-01']})
我想把日期列分成几组在一个新列中,叫做Date_Bin,规则是:从今天开始,如果日期中的值小于7天,那么值在新列中将是 'last 7 days',如果该值小于 14 天且距今天超过 7 天,则该值为“7 到 14 天”,如果该值小于 30 天且大于 14 days,则值为'14 to 30 days',30 to 60 days,60 to 90 days,超过90 days同理。 理想的输出是这样的:
Id Date Date_Bin
0 abs1 2021-06-15 last 7 days
1 abs2 2021-06-13 last 7 days
2 abs3 2021-06-07 7 to 14 days
3 plo2 2021-05-30 14 to 30 days
4 201805 2021-05-10 30 to 60 days
5 201806 2021-04-28 30 to 60 days
6 202011 2021-04-15 60 to 90 days
7 pctx1 2021-02-01 more than 90 days
如您所见,这些是我唯一需要的 groups/bins 数据。我尝试了几种方法,但没有奏效,如果有人能提供帮助,我将不胜感激。
用 to_datetime
转换你的日期,然后从今天的 normalized
日期中减去(以便我们删除时间部分)并得到天数。然后使用 pd.cut
将它们适当地分组。
未来的任何事情都会被标记为 NaN
。
import pandas as pd
import numpy as np
df['Date'] = pd.to_datetime(df['Date'])
s = (pd.to_datetime('today').normalize() - df['Date']).dt.days
df['Date_Bin'] = pd.cut(s, [0, 7, 14, 30, 60, 90, np.inf],
labels=['last 7 days', '7 to 14 days', '14 to 30 days',
'30 to 60 days', '60 to 90 days', 'more than 90 days'],
include_lowest=True)
print(df)
Id Date Date_Bin
0 abs1 2021-06-15 last 7 days
1 abs2 2021-06-13 last 7 days
2 abs3 2021-06-07 7 to 14 days
3 plo2 2021-05-30 14 to 30 days
4 201805 2021-05-12 30 to 60 days
5 201806 2021-04-28 30 to 60 days
6 202011 2021-04-15 60 to 90 days
7 pctx1 2021-02-01 more than 90 days
为了将来的可重复性,在撰写本文时:
pd.to_datetime('today').normalize()
#Timestamp('2021-06-15 00:00:00')