2016-06-06 6 views
0

Учитывая следующий кадр данных:Панды Создать диапазон дат без выходных

import pandas as pd 
df=pd.DataFrame({'A':['a','b','c'], 
     'first_date':['2015-08-31 00:00:00','2015-08-24 00:00:00','2015-08-25 00:00:00']}) 
df.first_date=pd.to_datetime(df.first_date) #(dtype='<M8[ns]') 
df['last_date']=pd.to_datetime('5/6/2016') #(dtype='datetime64[ns]') 
df 

    A first_date last_date 
0 a 2015-08-31 2016-05-06 
1 b 2015-08-24 2016-05-06 
2 c 2015-08-25 2016-05-06 

Я хотел бы создать новый столбец, который содержит список (или массив) даты между «first_date» и «last_date» который исключает выходные.

До сих пор, я попытался это:

pd.date_range(df['first_date'],df['last_date']) 

... но эта ошибка:

TypeError: Cannot convert input to Timestamp 

Я также попытался это раньше pd.date_range ...

pd.Timestamp(df['first_date']) 

... но без кости.

Заранее благодарен!

PS:

После этого плетень, я буду пытаться смотреть на другие списки дат, и если они находятся в пределах сформированного массива (в строке «A»), а затем вычесть их из списка или массив). Я отправлю его как отдельный вопрос.

ответ

2

freq='B' дает вам рабочие дни или выходные.

Ваша ошибка:

TypeError: Cannot convert input to Timestamp

Это результат вас прохождения ряда функции pd.date_range, когда он ожидал Timestamp

Вместо этого используйте apply.

Однако мне все же сложно получить списки в определенные ячейки данных. Способ, которым я использую, - использовать pd.Series([mylist]). Обратите внимание, что это список списка. Если бы это было просто pd.Series(mylist), то pandas превратили бы список в серию, и вы бы получили серию сериалов, которая является файловой рамкой.

попробовать:

def fnl(x): 
    l = pd.date_range(x.loc['first_date'], x.loc['last_date'], freq='B') 
    return pd.Series([l]) 

df['range'] = df.apply(fnl, axis=1) 
+0

Спасибо! Итак, как вы обходились с требованием отметки времени, применяя применение к кадру данных и принимая серию списка списка? –

+1

вы делали 'date_range (timeseries1, timeseries2)', когда это должно было быть 'date_range (timestamp1, timestampe2)'. Используя 'apply (axis = 1)', мы переходим строки за строкой, захватываем метки времени для этой строки и получаем диапазон дат для этой строки. Класс/listOlist - всего лишь трюк, чтобы получить список в одну ячейку ячеек данных. Мы могли бы сделать и другие вещи. – piRSquared

+0

Еще раз спасибо. Последующий вопрос размещен здесь: http://stackoverflow.com/questions/37653493/pandas-remove-elements-from-datetimeindex-per-list-elements-in-range –

Смежные вопросы