我有一个相当复杂的问题.我需要在一组特定的开始日期和结束日期内从数据框中选择行,然后将这些值求和并将它们放入新的数据框中.
因此,我从数据帧df开始:
import random
dates = pd.date_range('20150101 020000',periods=1000)
df = pd.DataFrame({'_id': random.choice(range(0, 1000)),
'time_stamp': dates,
'value': random.choice(range(2,60))
})
并定义一些开始日期和结束日期:
import pandas as pd
start_date = ["2-13-16", "2-23-16", "3-17-16", "3-24-16", "3-26-16", "5-17-16", "5-25-16", "10-10-16", "10-18-16", "10-23-16", "10-31-16", "11-7-16", "11-14-16", "11-22-16", "1-23-17", "1-29-17", "2-06-17", "3-11-17", "3-23-17", "6-21-17", "6-28-17"]
end_date = pd.DatetimeIndex(start_date) + pd.DateOffset(7)
然后需要发生的是,我需要使用weekly_sum创建一个新的数据框,该框将在start_date和end_date之间出现的df的值列求和.
因此,例如,新数据帧的第一行将返回2-13-16和2-20-16之间的值之和.我想我会使用groupby.sum()或类似的东西.
它可能看起来像这样:
id start_date end_date weekly_sum
65 2016-02-13 2016-02-20 100
任何方向都将不胜感激!
附:我知道我对random.choice的使用有些不可思议,因此,如果您有更好的生成随机数的方法,我很乐意看到它!
解决方法:
您可以使用
def get_dates(x):
# Select the df values between start and ending datetime.
n = df[(df['time_stamp']>x['start'])&(df['time_stamp']
# Return first id and sum of values
return n['id'].values[0],n['value'].sum()
dates = pd.date_range('20150101 020000',periods=1000)
df = pd.DataFrame({'id': np.random.randint(0,1000,size=(1000,)),
'time_stamp': dates,
'value': np.random.randint(2,60,size=(1000,))
})
ndf = pd.DataFrame({'start':pd.to_datetime(start_date),'end':end_date})
#Unpack and assign values to id and value column
ndf[['id','value']] = ndf.apply(lambda x : get_dates(x),1).apply(pd.Series)
print(df.head(5))
id time_stamp value
0 770 2015-01-01 02:00:00 59
1 781 2015-01-02 02:00:00 32
2 761 2015-01-03 02:00:00 40
3 317 2015-01-04 02:00:00 16
4 538 2015-01-05 02:00:00 20
print(ndf.head(5))
end start id value
0 2016-02-20 2016-02-13 569 221
1 2016-03-01 2016-02-23 28 216
2 2016-03-24 2016-03-17 152 258
3 2016-03-31 2016-03-24 892 265
4 2016-04-02 2016-03-26 606 244
标签:python,pandas,dataframe,datetime,group-by
来源: https://codeday.me/bug/20191013/1906876.html