如何选择熊猫分组的日期范围?

时间:2019-06-06 19:48:43

标签: python pandas

我有一个下面格式的数据框,我想按日期和项目分组,然后每天获取每个项目的序列号计数。

但是,我想将数据框中的日期限制为最近到10天之前的日期范围,并排除该范围之外的任何数据。

df = pd.DataFrame({'Date' : ['2018-01-01', '2018-01-01', '2018-01-02', '2018-01-03','2018-01-03', '2018-01-03', '2018-01-06, '2018-01-10'], 'Item' : ['Apple', 'Pear', 'Banana', 'Potato','Kiwi', 'Banana', 'Kiwi', 'Apple'],'serial no':['124161', '7124112', '123237', '765432','823542', '263872', '873492', '2342784']})
df

为了将数据框设置为我想要的格式,请执行以下操作并获取df,例如:

df = df.dropna(subset = ['Date','serial no']).sort_values(by = ['Date','serial no']).groupby(['Date','serial no']).count()
df

如何以所需的方式限制数据的日期范围?

我尝试使用类似datetime.datetime.now() -datetime.timedelta(10)之类的东西,但这给我键入错误。

3 个答案:

答案 0 :(得分:3)

您必须首先将date列转换为datetime数据类型:

df.Date = pd.to_datetime(df.Date)

现在您可以选择所需的范围:

slice = df[df.Date >= df.Date.max() - datetime.timedelta(10)]

P.S。过滤应在分组之前 完成。顺便说一句,它将使分组更快。

答案 1 :(得分:1)

如果您希望基准日期从框架中的最大日期中得出,请使用DYZ答复。如果您希望将其作为当前日期的基础,则可以使用以下方法。

from datetime import datetime, timedelta
days_to_subtract = 10
minDate_str = (datetime.today() - timedelta(days=days_to_subtract)).strftime('%Y-%m-%d')

df_raw = pd.DataFrame(
{'Date' : ['2019-05-10', '2019-05-20', '2019-08-02', '2019-01-03','2019-08-03', '2019-01-03', '2018-01-06', '2018-01-10'], 
 'Item' : ['Apple', 'Pear', 'Banana', 'Potato','Kiwi', 'Banana', 'Kiwi', 'Apple'],
 'serial no':  ['124161', '7124112', '123237', '765432','823542', '263872', '873492', '2342784']})

df = df_raw[df_raw['Date']>=minDate_str]


df = df.dropna(subset = ['Date','serial no']).sort_values(by = ['Date','serial no']).groupby(['Date','serial no']).count()
df

答案 2 :(得分:0)

按日期差异选择:

df['Date'] = pd.to_datetime(df['Date'])

# Choose some date, could be today
today = pd.to_datetime('today')
df['Days_Since'] = (today-df['Date']).dt.days

# Choose some choice of time, here in days
df_slice = df[df['Days_Since']<=516]

print(df_slice)
#   Date    Item    serial no   Days_Since
# 6 2018-01-06  Kiwi    873492  516
# 7 2018-01-10  Apple   2342784 512


要保持DYZ's的方式,您可以将日期与df.Date.max()进行比较

此后,您可以按组进行汇总。

df_counts = df_slice.groupby(['Date','serial no'])[['Item']].count()

print(df_counts)
#       Item
# Date  serial no   
# 2018-01-06    873492  1
# 2018-01-10    2342784 1
相关问题