Python 获取每周的最后一个值,以及匹配的日期

Python 获取每周的最后一个值,以及匹配的日期,python,pandas,Python,Pandas,因此,我从一个名为jpm的pd.Series开始,我想把它分成几个星期,并从每个星期中取最后一个值。这与下面的代码一起工作,它确实得到最后一个值。但是它将相应的索引更改为一周中的星期日,我希望它保持不变 import pandas_datareader.data as web import pandas as pd start = pd.datetime(2015, 11, 1) end = pd.datetime(2015, 11, 17) raw_jpm = web.DataReader

因此,我从一个名为
jpm
pd.Series
开始,我想把它分成几个星期,并从每个星期中取最后一个值。这与下面的代码一起工作,它确实得到最后一个值。但是它将相应的索引更改为一周中的星期日,我希望它保持不变

import pandas_datareader.data as web
import pandas as pd

start = pd.datetime(2015, 11, 1)
end = pd.datetime(2015, 11, 17)

raw_jpm = web.DataReader("JPM", 'yahoo', start, end)["Adj Close"]
jpm = raw_jpm.ix[raw_jpm.index[::2]]
jpm
现在

Date
2015-11-02    64.125610
2015-11-04    64.428918
2015-11-06    66.982593
2015-11-10    66.219427
2015-11-12    64.575682
2015-11-16    65.074678
Name: Adj Close, dtype: float64
Date
2015-11-08    66.982593
2015-11-15    64.575682
2015-11-22    65.074678
Freq: W-SUN, Name: Adj Close, dtype: float64
我想对它做一些操作,比如

weekly = jpm.groupby(pd.TimeGrouper('W')).last()
每周
现在开始

Date
2015-11-02    64.125610
2015-11-04    64.428918
2015-11-06    66.982593
2015-11-10    66.219427
2015-11-12    64.575682
2015-11-16    65.074678
Name: Adj Close, dtype: float64
Date
2015-11-08    66.982593
2015-11-15    64.575682
2015-11-22    65.074678
Freq: W-SUN, Name: Adj Close, dtype: float64
这很好,除了我所有的约会都变了。我想要的输出是:

Date
2015-11-06    66.982593
2015-11-12    64.575682
2015-11-16    65.074678

您可以通过指定类名
Week
并指示每周频率
W-FRI
,将
dayofweek
属性设置为4[星期一:0],来提供
DateOffset
→ 星期日:6]

jpm.groupby(pd.TimeGrouper(freq=pd.offsets.Week(weekday=4))).last().tail(5)

Date
2016-08-19    65.860001
2016-08-26    66.220001
2016-09-02    67.489998
2016-09-09    66.650002
2016-09-16    65.820000
Freq: W-FRI, Name: Adj Close, dtype: float64

如果希望开始日期为
start
date的下一个星期一,以及
end
日期的前一个星期日,可以这样做:

from datetime import datetime, timedelta

start = datetime(2015, 11, 1)
monday = start + timedelta(days=(7 - start.weekday())) 

end = datetime(2016, 9, 30)
sunday = end - timedelta(days=end.weekday() + 1)

print (monday)
2015-11-02 00:00:00
print (sunday)
2016-09-25 00:00:00
In [15]: jpm
Out[15]:
Date
2015-11-02    64.125610
2015-11-04    64.428918
2015-11-06    66.982593
2015-11-10    66.219427
2015-11-12    64.575682
2015-11-16    65.074678
Name: Adj Close, dtype: float64

In [16]: jpm.groupby(jpm.index.week).transform('last').drop_duplicates(keep='last')
Out[16]:
Date
2015-11-06    66.982593
2015-11-12    64.575682
2015-11-16    65.074678
dtype: float64
然后,将其用作:

jpm = web.DataReader('JPM', 'yahoo', monday, sunday)["Adj Close"]
jpm.groupby(pd.TimeGrouper(freq='7D')).last()
要在星期天获取所有信息,请按您指定的范围在星期一获取→ 周日和周日是考虑日期的最后一天,您可以做一个小改动:

monday_new = monday - timedelta(days=3)

jpm = web.DataReader('JPM', 'yahoo', monday_new, sunday)["Adj Close"]
jpm.groupby(pd.TimeGrouper(freq='W')).last().head()

Date
2015-11-01    62.863448
2015-11-08    66.982593
2015-11-15    64.145175
2015-11-22    66.082449
2015-11-29    65.720431
Freq: W-SUN, Name: Adj Close, dtype: float64

现在您已经发布了所需的输出,您可以使用
transform
方法获得结果,而不是使用聚合的
last
,这样它将返回一个索引大小与分组对象相同的对象

df = jpm.groupby(pd.TimeGrouper(freq='W')).transform('last').reset_index(name='Last')

df


注意:这能够处理在两个不同日期发生的重复条目,因为包含了
计数器
列,该列将它们分别存储在两个存储桶中。

您可以通过以下方式执行:

from datetime import datetime, timedelta

start = datetime(2015, 11, 1)
monday = start + timedelta(days=(7 - start.weekday())) 

end = datetime(2016, 9, 30)
sunday = end - timedelta(days=end.weekday() + 1)

print (monday)
2015-11-02 00:00:00
print (sunday)
2016-09-25 00:00:00
In [15]: jpm
Out[15]:
Date
2015-11-02    64.125610
2015-11-04    64.428918
2015-11-06    66.982593
2015-11-10    66.219427
2015-11-12    64.575682
2015-11-16    65.074678
Name: Adj Close, dtype: float64

In [16]: jpm.groupby(jpm.index.week).transform('last').drop_duplicates(keep='last')
Out[16]:
Date
2015-11-06    66.982593
2015-11-12    64.575682
2015-11-16    65.074678
dtype: float64
说明:

In [17]: jpm.groupby(jpm.index.week).transform('last')
Out[17]:
Date
2015-11-02    66.982593
2015-11-04    66.982593
2015-11-06    66.982593
2015-11-10    64.575682
2015-11-12    64.575682
2015-11-16    65.074678
dtype: float64

在纯熊猫身上这么做似乎有点棘手,所以我用了numpy

import numpy as np
weekly = jpm.groupby(pd.TimeGrouper('W-SUN')).last()
weekly.index = jpm.index[np.searchsorted(jpm.index, weekly.index, side="right")-1]

谢谢,但我不确定这是我要找的。我想保持日期不变,不改为星期五。你能用你想要的输出编辑这篇文章吗?我不太清楚你在问什么。我从帖子中删除了“星期五”这个词,也许这就是让人困惑的原因。在我更新帖子的同时,我会写一个更具体的例子,现在你应该看到11/6(一个星期五)下降了,我希望11/5在输出中Hanks Nickil,这似乎符合我的要求。这与我发布的答案相比如何?谢谢!虽然对于我给出的示例来说,删除重复项可能是不错的,但我发现这种方法有点“粗糙”,即,它可以更好地在其他输入上做意想不到的事情。你测试过它的整个日期范围吗?它返回正确吗?@NickilMaveli:是的,测试过了