如何从 python 中的日期字符串生成范围日期?

how to generate range date from date string in python?

我有如下图所示的日期格式:

    {
      "amount": 599400,
      "date_cart_closed": "2015-03"
    },
    {
      "amount": 575856,
      "date_cart_closed": "2015-01"
    },
    {
      "amount": 2216490,
      "date_cart_closed": "2015-05"
    }

这里我们有类似 2015-03 的格式。基准日期从 2011-01-01 开始固定,直到用户在 UNIX_TIMESTAMP 中输入的日期,如 1343287040

现在的问题是我有开始日期和结束日期。在这个范围内,我必须填补空白。简单来说,我没有2011-012011-022015-03等。如何填补这些空白?有办法处理这种情况吗?


编辑 1:
似乎 pandas 创建了一个基于月份的范围日期。我为生成月份做了以下操作:

pandas.date_range(start='20140101', end='20140501', freq='M')

其输出如下:

DatetimeIndex(['2014-01-31', '2014-02-28', '2014-03-31', '2014-04-30'], dtype='datetime64[ns]', freq='M', tz=None)

它以某种方式解决了我的问题,但我需要这样的输出:2014-01 而不是 2014-01-01。有没有办法格式化输出?

将您的日期转换为整数,以自 0 年以来的月数表示:

def yearmonth_to_ordinal(date_string):
    year, month = map(int, date_string.split('-'))
    return year * 12 + (month - 1)

因此 2015-01 变为 24180,2015-03 变为 24182,等等。您现在可以在序数上创建一个范围。

要返回日期字符串,请使用模块化算法:

def ordinal_to_yearmonth(ordinal):
    year, month = divmod(ordinal, 12)
    return '{:04d}-{:02d}'.format(year, month + 1)

演示:

>>> yearmonth_to_ordinal('2015-05')
24184
>>> ordinal_to_yearmonth(yearmonth_to_ordinal('2015-05') + 7)
'2015-12'

这是单行本。您可以使用 numpy.astype('<M8[M]') 将日期时间对象转换为每月频率,然后使用 .astype(str) 获取 unicode 字符串。此操作是矢量化的,对于大型数据集非常快。

import pandas as pd
import numpy as np

# sample datetime index
# ================================
ts_index = pd.date_range(start='20140101', end='20140501', freq='M')
ts_index

DatetimeIndex(['2014-01-31', '2014-02-28', '2014-03-31', '2014-04-30'], dtype='datetime64[ns]', freq='M', tz=None)

# processing
# ===================================
ts_index.values.astype('<M8[M]').astype(str)

array(['2014-01', '2014-02', '2014-03', '2014-04'], 
      dtype='<U25')