2016-06-17 89 views
5

pd.date_range('2016-01', '2016-05', freq='M',).strftime('%Y-%m'),上個月是2016-04,但我期待它是2016-05。在我看來,這個函數的行爲類似於range方法,其中end參數不包含在返回數組中。如何在pandas date_range方法中包含結束日期?

有沒有辦法讓末月包含在返回數組中,而不處理結束月份的字符串?

回答

2

做到這一點的一種方式指定的日期時包含的一天。

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

有了這個解決方案,我不需要搗亂天和(n + 1)個月。 – srodriguex

0

我不這麼認爲。 您需要添加的(N + 1)邊界

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

的開始和結束日期是嚴格的包容性。因此,如果指定,那麼 將不會生成這些日期之外的任何日期。 http://pandas.pydata.org/pandas-docs/stable/timeseries.html

無論哪種方式,你必須手動添加一些信息。我相信再增加一個月並不是很多工作。

+0

當freq ='D''時,這個文檔的引用是成立的,當它是月份時,它不適用於結束日期艱難。 – srodriguex

+0

好的。它不會改變你需要添加你的邊界的事實:) –

0

沒有搞清楚月結束自己搞亂在date_range電話

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

如果你手動添加一天,那麼你可能只需再增加一個月,你不認爲 –

+0

不。我可以想象一個需要和理由,關於情況。 – piRSquared

4

您可以使用.union初始化date_range後添加的下一個邏輯值。它應該作爲任何頻率來寫:

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

或者,你可以使用period_range而不是date_range。根據你打算做什麼,這可能不是用正確的事情,但它滿足了你的問題:

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

在這兩種情況下,如預期的輸出結果:

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

感謝period_range,那就是我一直在尋找的東西。 – Tickon

2

對於後來的人羣。您也可以嘗試使用月開始頻率。

>>> 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') 
相關問題