我有以下数据框:
Date Time Quantity
20171003 5:00 2
20171003 5:15 5
....
20171005 5:00 1
20171005 5:15 9
我需要创建一个新列,其中包含上周同一天的数量,即:
Date Time Quantity Quantity-1
20171003 5:00 2 NaN
20171003 5:15 5 NaN
....
20171005 5:00 1 2
20171005 5:15 9 5
我想通过使用例如:
来了解如何获得上周的同一天last_week = today() + relativedelta(weeks=-1, weekday= now.weekday())
如何将此应用于我的数据框?
提前谢谢!
答案 0 :(得分:2)
您的索引是否有模式?如果是,您可以使用pd.shift()
。 periods
参数将是df
中的句点数。例如,假设您的Time
列始终是5:00
或5:15
,并且您有日历日,那么您的period
将为7 * 2 = 14
df['Quantity-1'] = df['Quantity'].shift(14)
答案 1 :(得分:1)
如果每天都以完全相同的长度收集数据,那么使用pd.shift
作为@EricB提到的应该是完美的。
或者,您可以创建新的数据框和merge
,其中天数移动14天,然后合并回专栏date
和time
上的原始数据框(注意假设您在接下来的14天内同时想要数量。)
df = pd.DataFrame([
['20171003', '5:00', '2'],
['20171003', '5:15', '5'],
['20171005', '5:00', '1'],
['20171005', '5:15', '9'],
['20171019', '5:00', '8']],
columns=['date', 'time', 'quantity'])
df.loc[:, 'date'] = pd.to_datetime(df.date)
df2 = df[['date', 'time', 'quantity']]
df2.loc[:, 'date'] = df2.date + datetime.timedelta(weeks=2) # shift by 2 weeks
df_shift = df.merge(df2, on=['time', 'date'], how='left')
df_shift
的输出
+-----------+----+----------+----------+
| date|time|quantity_x|quantity_y|
+-----------+----+----------+----------+
|2017-10-03 |5:00| 2| |
|2017-10-03 |5:15| 5| |
|2017-10-05 |5:00| 1| |
|2017-10-05 |5:15| 9| |
|2017-10-19 |5:00| 8| 1|
+-----------+----+----------+----------+