2017-02-16 15 views
5

Mam pandas DataFrame z kolumną indeksu = date.Jak piętro datę na pierwszą datę tego miesiąca?

Wejście:

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

Chcę piętrze datę na pierwszy dzień danego miesiąca

wyjściowa:

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

Co próbowałem:

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

To jest potencjalnie ause df jest generowany przez df = df.resample("M").sum() (Wyjście tego kodu jest wejściem na początku pytania)

Próbowałem również df = df.resample("M", convention='start').sum(). Jednak to nie działa.

Wiem, że w języku R łatwo jest po prostu zadzwonić pod numer floor(date, 'M').

+0

Czy wydajność problem? Rozważałoby przekształcenie wartości w obiekty 'datetime', ale może to być kosztowne, jeśli próbujesz przetwarzać miliony obiektów. – Alfe

Odpowiedz

4

Można użyć timeseries przesunięcie MonthBegin

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

jest to jedyne pandoniczne podejście spośród wszystkich odpowiedzi (jako bonus jest wektoryzowany) – Jeff

+0

Jest błąd z tą metodą: przetłumaczył on każdą datę na początek następnego miesiąca, z wyjątkiem początku miesiąca, który pozostaje to samo. tj. 1-1-2018 -> 1-1-2018, ale 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) 

Dla Panda DataFrame, można użyć dt["col_name_date"].apply(first_day).

1

To wystarczy, aby zrobić wszystko bez importu. Numpy ma dtype datetime64, który domyślnie panda ustawia na [ns], jak widać po sprawdzeniu dtype. Możesz zmienić to na miesiąc, który rozpocznie się pierwszego dnia miesiąca, uzyskując dostęp do tablicy numpy i zmieniając typ.

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

Byłoby miło, gdyby pandy byłoby zaimplementować to z własnej metody astype() ale niestety nie można.

Powyższe prace dotyczące danych jako wartości datetime lub strun, jeśli masz już dane jako datetime[ns] typu można pominąć pd.to_datetime() i po prostu zrobić:

df.date = df.date.values.astype('datetime64[M]') 
Powiązane problemy