2016-06-17 31 views
5

Od pd.date_range('2016-01', '2016-05', freq='M',).strftime('%Y-%m'), ostatni miesiąc to 2016-04, ale spodziewałem się, że będzie to 2016-05. Wydaje mi się, że ta funkcja zachowuje się jak metoda range, gdzie parametr końcowy nie jest zawarty w zwracanej tablicy.Jak uwzględnić datę zakończenia w pandach metoda date_range?

Czy istnieje sposób na uzyskanie miesiąca końcowego uwzględnionego w zwracanej tablicy, bez przetwarzania ciągu na miesiąc końcowy?

Odpowiedz

2

sposób to zrobić bez brudząc z zastanawianie się miesiąc kończy się.

pd.date_range(*(pd.to_datetime(['2016-01', '2016-05']) + pd.offsets.MonthEnd()), freq='M') 

DatetimeIndex(['2016-01-31', '2016-02-29', '2016-03-31', '2016-04-30', 
      '2016-05-31'], 
      dtype='datetime64[ns]', freq='M') 
+0

Dzięki temu rozwiązaniu nie muszę robić bałaganu w dniach i (n + 1) miesiącu. – srodriguex

0

Nie sądzę. Trzeba dodać (n + 1) granica

pd.date_range('2016-01', '2016-06', freq='M').strftime('%Y-%m') 

początku i na końcu daty są ściśle włącznie. Więc nie wygeneruje żadnych dat poza tymi datami, jeśli zostaną określone. http://pandas.pydata.org/pandas-docs/stable/timeseries.html

Tak czy inaczej, musisz ręcznie dodać pewne informacje. Uważam, że dodanie tylko jednego miesiąca nie wymaga wiele pracy.

+0

Ten cytat z dokumentów ma wartość true, gdy 'freq = 'D'', gdy jest miesięczny, nie wytrzymuje ciężkiej daty zakończenia. – srodriguex

+0

ok. nie zmienia to faktu, że musisz dodać swoją granicę :) –

0

Dołącz dzień po określeniu daty date_range rozmowy

pd.date_range('2016-01-31', '2016-05-31', freq='M',).strftime('%Y-%m') 

array(['2016-01', '2016-02', '2016-03', '2016-04', '2016-05'], 
     dtype='|S7') 
+0

Jeśli dodasz dzień ręcznie, równie dobrze możesz po prostu dodać jeszcze jeden miesiąc, nie myśl o tym –

+0

Nie. Mogę sobie wyobrazić potrzebę i powód, dla którego preferuję na temat sytuacji. – piRSquared

4

Można użyć .union dodać kolejną wartość logiczną po uruchomieniu date_range. Powinien działać jako napisany dla każdej częstotliwości:

d = pd.date_range('2016-01', '2016-05', freq='M') 
d = d.union([d[-1] + 1]).strftime('%Y-%m') 

Alternatywnie, można użyć period_range zamiast date_range. W zależności od tego, co zamierzamy zrobić, to nie może być słuszne w użyciu, ale spełnia swoje pytanie:

pd.period_range('2016-01', '2016-05', freq='M').strftime('%Y-%m') 

w każdym przypadku, uzyskany wyjściowy jest zgodnie z oczekiwaniami:

['2016-01' '2016-02' '2016-03' '2016-04' '2016-05'] 
+0

Dzięki za period_range, tego właśnie szukałem. – Tickon

2

Dla późniejszy tłum. Możesz także spróbować skorzystać z częstotliwości Rozpoczęcie miesiąca.

>>> pd.date_range('2016-01', '2016-05', freq='MS', format = "%Y-%m") 
DatetimeIndex(['2016-01-01', '2016-02-01', '2016-03-01', '2016-04-01', 
       '2016-05-01'], 
       dtype='datetime64[ns]', freq='MS') 
Powiązane problemy