python - 创建具有任意开始日期的每月时间序列

标签 python pandas python-datetime

使用 pandas 可以轻松创建每月的日期系列。

import pandas as pd

pd.date_range('2012-04-23', '2013-01-23', freq='BM')

DatetimeIndex(['2012-04-30', '2012-05-31', '2012-06-29', '2012-07-31',
               '2012-08-31', '2012-09-28', '2012-10-31', '2012-11-30',
               '2012-12-31'],
              dtype='datetime64[ns]', freq='BM')

请注意,DatetimeIndex 中的日期是月末。我知道应该考虑我选择 freq='BM',但我不相信我有一个可以实现我的目标的选择。

我经常需要生成从每个月最后一个工作日开始的每月日期系列。

我想看看这个:

DatetimeIndex(['2012-04-23', '2012-05-23', '2012-06-23', '2012-07-23',
               '2012-08-23', '2012-09-23', '2012-10-23', '2012-11-23',
               '2012-12-23'],
              dtype='datetime64[ns]', freq=None)

或另一个更复杂的示例可能是获取从“2012-01-30”到“2012-04-30”的月份。我希望看到:

DatetimeIndex(['2012-01-30', '2012-02-29', '2012-03-30', '2012-04-30'],
              dtype='datetime64[ns]', freq=None)

最佳答案

您可能正在寻找这样的东西:

from pandas.tseries.offsets import Day, BDay
pd.date_range(start = '2012-01-01', periods = 6, freq = 'MS') + Day(22) + BDay(0)
Out[12]: 
DatetimeIndex(['2012-01-23', '2012-02-23', '2012-03-23', '2012-04-23',
               '2012-05-23', '2012-06-25'],
              dtype='datetime64[ns]', freq=None)

Day(22) 添加 22 天的偏移量,BDay 负责工作日偏移量(BDay(0) 采用最接近的值工作日)。

从 30 号开始的日期会有点困难。所以我必须为此编写一个函数。 (为了代码的清晰性,它不允许自定义 freq 参数。)

def my_business_date_range(day, **kwargs):
    assert(isinstance(day, int) & (day > 0) & (day < 32))
    rng0 = pd.date_range(freq = 'MS', **kwargs)
    rng1 = rng0 + pd.tseries.offsets.Day(day-1) + pd.tseries.offsets.BDay(0)
    # Correcting overflows:
    overflow_idx, = np.nonzero(rng0.month != rng1.month)
    if overflow_idx.size > 0:
        # rng1 is not mutable
        tmp = rng1.tolist()        
        bme = pd.tseries.offsets.BusinessMonthEnd(-1)
        for i in overflow_idx:
            tmp[i] = bme(rng1[i])
        rng1 = pd.DatetimeIndex(tmp)
    return rng1

my_business_date_range(30, start= '2012-01-01', periods = 6)
Out[13]: 
DatetimeIndex(['2012-01-30', '2012-02-29', '2012-03-30', '2012-04-30',
               '2012-05-30', '2012-06-29'],
              dtype='datetime64[ns]', freq=None)

Pandas 还有一个实验 CustomBusinessMonth and the like但我无法让它发挥作用。

关于python - 创建具有任意开始日期的每月时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37084925/

相关文章:

python - 如何将数据写入 Redshift,这是在 Python 中创建的数据框的结果?

python - 如何进行分组并获取收入变化百分比

python - Pandas 如何按时间段过滤 DataFrame

python - 如何修复错误 : command 'x86_64-linux-gnu-gcc' failed with exit status 1

python - Pycharm - 在远程解释器中配置 PYTHONPATH

python - Pandas 相似度计算中的序数变量处理

python - 根据不同类型的值派生日期列

python - 如何将多个条形图放在 x 刻度上居中?

Python代码编译问题

pandas - 从 Pandas 数据框中的日期列中减去日期列