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:是的,测试过了