2015-08-09 4 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 принимает аргумент 'days', и я не знаю, что месяц составляет 31 день или 29 дней. – ALH

ответ

3

Вот один вкладыш. Вы можете использовать numpy.astype('<M8[M]') для приведения объекта datetime к ежемесячной частоте, а затем .astype(str), чтобы получить строку юникода. Эта операция векторизована и очень быстро используется для большого набора данных.

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' 
Смежные вопросы