如何从 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-01
、2011-02
、2015-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')
我有如下图所示的日期格式:
{
"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-01
、2011-02
、2015-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')