我有一个下面格式的数据框,我想按日期和项目分组,然后每天获取每个项目的序列号计数。
但是,我想将数据框中的日期限制为最近到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)
之类的东西,但这给我键入错误。
答案 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