2017-02-16 3 views
5

У меня есть панда DataFrame с индексным столбцом = date.Как установить дату на первую дату этого месяца?

Вход:

  value 
date  
1986-01-31 22.93 
1986-02-28 15.46 

Я хочу пол дату в первый день этого месяца

Выход:

  value 
date  
1986-01-01 22.93 
1986-02-01 15.46 

Что я пробовал:

df.index.floor('M') 
ValueError: <MonthEnd> is a non-fixed frequency 

Это потенциально становится ause df генерируется df = df.resample("M").sum() (Выход этого кода - это ввод в начале вопроса)

Я также пробовал df = df.resample("M", convention='start').sum(). Однако это не работает.

Я знаю в R, легко можно просто позвонить floor(date, 'M').

+0

Является ли производительность проблемы? Я бы подумал о преобразовании значений в объекты 'datetime' для этого, но это может быть дорогостоящим, если вы пытаетесь обрабатывать миллионы объектов. – Alfe

ответ

4

Вы можете использовать таймсерии смещение MonthBegin

from pandas.tseries.offsets import MonthBegin 
df['date'] = pd.to_datetime(df['date']) + MonthBegin(0) 
+3

Это единственный пандонический подход среди всех ответов (в качестве бонуса это векторизован) – Jeff

+0

Есть ошибка с этим методом: он переведет любую дату в начало следующего месяца, за исключением начала месяца, который остается тоже самое. т.е. 1-1-2018 -> 1-1-2018, но 2-1-2018 -> 1-2-2018 ... –

1
dt_1 = "2016-02-01" 
def first_day(dt): 
    lt_split = dt.split("-") 
    return "-".join([lt_split[0], lt_split[1], "01"]) 

print first_day(dt_1) 

Для DataFrame Panda, вы можете использовать dt["col_name_date"].apply(first_day).

1

Это сделает трюк и не потребует импорт. У Numpy есть dtype datetime64, который по умолчанию устанавливает pandas на [ns], как видно из проверки типа dtype. Вы можете изменить это на месяц, который начнется в первом месяце, обратившись к массиву numpy и изменив тип.

df.date = pd.to_datetime(df.date.values.astype('datetime64[M]')) 

Было бы хорошо, если бы панды осуществить это с их собственным astype() метод, но, к сожалению, вы не можете.

Вышеуказанные работы для данных в качестве значений даты и времени или строк, если у вас уже есть ваши данные в виде datetime[ns] типа можно опустить pd.to_datetime() и просто сделать:

df.date = df.date.values.astype('datetime64[M]')