如何调整Grouper的开始时间?
从这个样本DF开始:
import datetime as DT
df = pd.DataFrame({
'Buyer': 'Carl Mark Carl Joe Joe Carl'.split(),
'Quantity': [1,3,5,8,9,3],
'Date' : [
DT.datetime(2013,1,1,13,0),
DT.datetime(2013,3,1,13,5),
DT.datetime(2013,5,1,20,0),
DT.datetime(2013,8,2,10,0),
DT.datetime(2013,9,2,12,0),
DT.datetime(2013,11,2,14,0),
]})
df = df.set_index('Date')
df.groupby(pd.Grouper(freq='1MS'))["Quantity"].count()
Date
2013-01-01 1
2013-02-01 0
2013-03-01 1
2013-04-01 0
2013-05-01 1
2013-06-01 0
2013-07-01 0
2013-08-01 1
2013-09-01 1
2013-10-01 0
2013-11-01 1
df.groupby(pd.Grouper(freq='2MS'))["Quantity"].count()
Date
2013-01-01 1
2013-03-01 1
2013-05-01 1
2013-07-01 1
2013-09-01 1
2013-11-01 1
我在索引日期使用"2MS"
查找的是Grouper or TimeGrouper
。以上是从索引中的第一个值或2013年1月1日返回"2MS"
。如何从2MS
获取'8/1/2013'
2。
定位:
Date
2013-01-01 1
2013-03-01 1
2013-05-01 1
2013-08-01 2
2013-09-01 1
2013-11-01 1
注意:
我尝试根据索引值进行分组... - 第一组将从1/1开始切片。第二个切片将从3/1开始,第三个切片从5/1开始。结束时期为2MS。现在使用Grouper,它从第一个日期开始切片,并以两个月的间隔继续。第四个间隔应从8/1结束10/2开始。现在,8/2从7/1开始。
答案 0 :(得分:0)
您想要一个向前滚动窗口,而pandas
向后滚动窗口。因此,我们的想法是颠倒你的系列的顺序,采取滚动窗口,然后恢复排序。
这就是你已经拥有的:
from datetime import datetime
import pandas as pd
df = pd.DataFrame({'Buyer': 'Carl Mark Carl Joe Joe Carl'.split(),
'Quantity': [1, 3, 5, 8, 9, 3],
'Date' : [datetime(2013, 1, 1, 13, 0),
datetime(2013, 3, 1, 13, 5),
datetime(2013, 5, 1, 20, 0),
datetime(2013, 8, 2, 10, 0),
datetime(2013, 9, 2, 12, 0),
datetime(2013, 11, 2, 14, 0)]})
df = df.set_index('Date')
print(df)
# Buyer Quantity
# Date
# 2013-01-01 13:00:00 Carl 1
# 2013-03-01 13:05:00 Mark 3
# 2013-05-01 20:00:00 Carl 5
# 2013-08-02 10:00:00 Joe 8
# 2013-09-02 12:00:00 Joe 9
# 2013-11-02 14:00:00 Carl 3
g1 = df.resample('MS')["Quantity"].count()
print(g1)
# Date
# 2013-01-01 1
# 2013-02-01 0
# 2013-03-01 1
# 2013-04-01 0
# 2013-05-01 1
# 2013-06-01 0
# 2013-07-01 0
# 2013-08-01 1
# 2013-09-01 1
# 2013-10-01 0
# 2013-11-01 1
# Freq: MS, Name: Quantity, dtype: int64
这就是如何到达终点线:
g2 = g1.sort_index(ascending=False).rolling(2, 0).sum().sort_index()
print(g2)
# Date
# 2013-01-01 1.0
# 2013-02-01 1.0
# 2013-03-01 1.0
# 2013-04-01 1.0
# 2013-05-01 1.0
# 2013-06-01 0.0
# 2013-07-01 1.0
# 2013-08-01 2.0
# 2013-09-01 1.0
# 2013-10-01 1.0
# 2013-11-01 1.0
# Freq: MS, Name: Quantity, dtype: float64
print(g2[g1 != 0].astype(int))
# Date
# 2013-01-01 1
# 2013-03-01 1
# 2013-05-01 1
# 2013-08-01 2
# 2013-09-01 1
# 2013-11-01 1
# Name: Quantity, dtype: int64