获取时间序列熊猫每个月的最后日期

时间:2015-06-09 22:21:26

标签: python pandas zipline

目前我正在使用某个函数zipline.utils.tradingcalendar.get_trading_days生成DateTimeIndex。时间序列大致是每天,但有一些差距。

我的目标是每月在DateTimeIndex获取最后一个日期。

.to_period('M')&amp; .to_timestamp('M')因为他们给出了每个月的最后一天而不是每月的变量的最后一个值,所以<div id="text-panel"> <div id="important-text"> <p>important text</p> <p>important text</p> </div> <div id="scroll-text"> <p>scroll text</p> <p>scroll text</p> <p>scroll text</p> <p>scroll text</p> <p>scroll text</p> <p>scroll text</p> <p>scroll text</p> <p>scroll text</p> <p>scroll text</p> <p>scroll text</p> </div> </div> 无法工作。

例如,如果这是我的时间序列,我想选择&#39; 2015-05-29&#39;而本月的最后一天是2015-05-31&#39;。

[&#39; 2015-05-18&#39;,&#39; 2015-05-19&#39;,&#39; 2015-05-20&#39;,&#39; 2015-05 -21&#39 ;,                &#39; 2015-05-22&#39;,&#39; 2015-05-26&#39;,&#39; 2015-05-27&#39;,&#39; 2015-05-28&#39 ;,                &#39; 2015-05-29&#39;,&#39; 2015-06-01&#39;]

6 个答案:

答案 0 :(得分:5)

Condla的答案最接近我所需要的,但是由于我的时间指数延长了一年多,我需要按月和年分组,然后选择最长日期。下面是我最终得到的代码。

# tempTradeDays is the initial DatetimeIndex
dateRange = []  
tempYear = None  
dictYears = tempTradeDays.groupby(tempTradeDays.year)
for yr in dictYears.keys():
    tempYear = pd.DatetimeIndex(dictYears[yr]).groupby(pd.DatetimeIndex(dictYears[yr]).month)
    for m in tempYear.keys():
        dateRange.append(max(tempYear[m]))
dateRange = pd.DatetimeIndex(dateRange).order()

答案 1 :(得分:3)

我的策略是按月分组,然后选择&#34;最大值&#34;每组:

如果&#34; dt&#34;是你的DatetimeIndex对象:

last_dates_of_the_month = []
dt_month_group_dict = dt.groupby(dt.month)
for month in dt_month_group_dict:
    last_date = max(dt_month_group_dict[month])
    last_dates_of_the_month.append(last_date)

列表&#34; last_date_of_the_month&#34;包含数据集中每个月的所有出现日期。你可以使用这个列表再次在pandas中创建一个DatetimeIndex(或者你想用它做什么)。

答案 2 :(得分:3)

这是一个老问题,但这里现有的所有答案并不完美。这是我提出的解决方案(假设日期是一个排序索引),甚至可以写成一行,但我将其拆分以便于阅读:

pd.Series

这里有几点说明:

  • 转移日期时间序列需要另一个.values实例(请参阅here
  • 布尔掩码索引需要apple.resample('BM')(请参阅here

顺便说一下,如果日期是营业日,则更容易使用重新取样:{{1}}

答案 3 :(得分:2)

也许不再需要答案,但在寻找同一问题的答案时,我发现可能是一个更简单的解决方案:

import pandas as pd 

sample_dates = pd.date_range(start='2010-01-01', periods=100, freq='B')
month_end_dates = sample_dates[sample_dates.is_month_end]

答案 4 :(得分:0)

假设您的数据框看起来像这样

original dataframe

然后下面的代码将为您提供每月的最后一天。

df_monthly = df.reset_index().groupby([df.index.year,df.index.month],as_index=False).last().set_index('index')

transformed_dataframe

这一行代码完成了它的工作:)

答案 5 :(得分:0)

尝试此操作,以创建一个新的差异列,其中值1指向从一个月到下个月的更改。

     df['diff'] = np.where(df['Date'].dt.month.diff() != 0,1,0)