微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Python / Pandas提取时间序列中的工作日

如何解决使用Python / Pandas提取时间序列中的工作日

不幸的是,这有点慢,但是至少应该给出您想要的答案。

#create an index of just the date portion of your index (this is the slow step)
ts_days = pd.to_datetime(ts.index.date)

#create a range of business days over that period
bdays = pd.bdate_range(start=ts.index[0].date(), end=ts.index[-1].date())

#Filter the series to just those days contained in the business day range.
ts = ts[ts_days.isin(bdays)]

解决方法

我正在处理“时间序列”中的高频数据, 我希望从我的数据中获取所有工作日
。我的数据观察结果以秒为单位,因此每天有86400秒,我的数据集分布在31天之内(因此有2678400个观察值!)。

这是我的数据的(一部分):

In[1]: ts
Out[1]: 
2013-01-01 00:00:00    0.480928
2013-01-01 00:00:01    0.480928
2013-01-01 00:00:02    0.483977
2013-01-01 00:00:03    0.486725
2013-01-01 00:00:04    0.486725
...
2013-01-31 23:59:56    0.451630
2013-01-31 23:59:57    0.451630
2013-01-31 23:59:58    0.451630
2013-01-31 23:59:59    0.454683
Freq: S,Length: 2678400

我想做的是创建一个新的时间序列,其中包含本月的工作日,但我希望它们具有相应的数据秒。
例如,如果2013年1月1日(星期三)至2013年1月4日(星期五)是一月第一周的第一工作日,则:

2013-01-02 00:00:00    0.507477
2013-01-02 00:00:01    0.501373
...
2013-01-03 00:00:00    0.489778
2013-01-03 00:00:01    0.489778
...
2013-01-04 23:59:58    0.598115
2013-01-04 23:59:59    0.598115
Freq: S,Length: 259200

因此,由于这些是周末,因此当然会排除2013年1月5日和2013年1月6日星期六的所有数据。等等…

我尝试使用一些内置的pandas命令,但是由于它们是按日汇总的,因此没有找到正确的命令,而没有考虑到每天其中都包含子列。也就是说,每一秒都有一个值,不应将它们取平均值,而应将其分组为一个新的序列。

例如我试过:

  1. ts.asfreq(BDay()) ->查找工作日,但每天平均
  2. ts.resample() ->您必须定义“方式”(平均值,最大值,最小值…)
  3. ts.groupby(lambda x : x.weekday) ->也不行!
  4. ts = pd.Series(df,index = pd.bdate_range(start = '2013/01/01 00:00:00',end = '2013/01/31 23:59:59',freq = 'S')) -> df,因为原始数据为DataFramem。使用pd.bdate_range并没有帮助,因为df和index必须在同一维上。

我在熊猫文档中搜索过,但用谷歌搜索,但是找不到线索…
有人有想法吗?

我将衷心感谢您的帮助!

谢谢!

ps:我宁愿不使用循环,因为我的数据集很大…(我还有其他几个月要分析)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。