2015-08-09 59 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'