10

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

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

.to_period('M')&.to_timestamp('M')不起作用,因为它们给出了每月的最后一天,而不是每个月变量的最后一个值。

例如,如果这是我的时间序列,我想选择“2015-05-29”,而当月的最后一天是“2015-05-31”。

['2015-05-18', '2015-05-19', '2015-05-20', '2015-05-21', '2015-05-22', '2015-05-26', ' 2015-05-27'、'2015-05-28'、'2015-05-29'、'2015-06-01']

4

6 回答 6

6

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()
于 2015-06-10T12:15:02.013 回答
3

我的策略是按月分组,然后选择每个组的“最大值”:

如果“dt”是您的 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)

列表“last_date_of_the_month”包含数据集中每个月所有出现的最后日期。您可以使用此列表再次在 pandas 中创建 DatetimeIndex(或任何您想用它做的事情)。

于 2015-06-09T23:05:20.240 回答
3

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

原始数据框

然后下面的代码会给你每个月的最后一天。

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

转换数据帧

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

于 2019-05-24T20:56:54.767 回答
3

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

month1 = pd.Series(apple.index.month)
month2 = pd.Series(apple.index.month).shift(-1)
mask = (month1 != month2)
apple[mask.values].head(10)

这里有几点注意事项:

  • 转换日期时间序列需要另一个pd.Series实例(请参见此处
  • 布尔掩码索引需要.values(见这里

顺便说一句,当日期是工作日时,使用重采样会更容易:apple.resample('BM')

于 2018-02-21T18:17:26.493 回答
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]
于 2015-08-21T08:04:25.873 回答
0

试试这个,创建一个新的差异列,其中值 1 指向从一个月到下一个月的变化。

     df['diff'] = np.where(df['Date'].dt.month.diff() != 0,1,0) 
于 2020-08-06T15:21:48.700 回答