2015-08-09 80 views
1

我有日期的格式如下面的图片:如何从日期字符串生成范围日期在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等。如何填补这些空白?有没有办法处理这种情况?


EDIT1:
看来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。有没有格式化输出的方法?

+1

您可能刚发布了*文本*,而不是文本的图像。 –

+1

只需将日期解析到Python'datetime.datetime'对象中;这是在别处回答,然后使用我的解决方案从重复。 –

+0

@MartijnPieters,您提到我的问题不能用于每月生成日期。由于timedelta采取'天'的论点,我不知道这个月是31天或29天。 – ALH

回答

3

这里是一个班轮。您可以使用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') 
+0

' ALH

+1

@phpGeek'

1

转换日期为整数,在月数自今年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'