2016-05-06 152 views
1

在Python的熊貓中是否有等價於SQL的datediff函數? 這個問題的答案: Add column with number of days between dates in DataFrame pandas 解釋如何計算天數的差異。例如:pandas:功能相當於SQL的datediff()?

>>> (pd.to_datetime('15-10-2010') - pd.to_datetime('15-07-2010'))/pd.offsets.Day(1) 
92.0 

不過,我有兩個問題:

  1. 有沒有一種方法來計算月的區別?我可以近似地將結果除以30,除以31,但我想知道是否有一些內置函數自動執行此操作。
  2. pd.offsets的語法是什麼?我嘗試除以pd.offsets.Month(1),它不起作用。我在這裏擡頭的文檔(這是殘酷的,像所有的Python的文檔!):http://pandas.pydata.org/pandas-docs/stable/timeseries.html#dateoffset-objects但天()是不存在的,所以我很困惑
+0

此外,我似乎無法將結果轉換爲整數。有任何想法嗎? –

+0

嗯,我在這裏找到http://stackoverflow.com/questions/22132525/add-column-with-number-of-days-between-dates-in-dataframe-pandas如何從timedelta轉換爲float:除以np .timedelta64(1, 'd')。爲什麼以及它在哪裏被記錄,是單獨的問題! –

回答

1

UPDATE:

def months_between(d1, d2): 
    dd1 = min(d1, d2) 
    dd2 = max(d1, d2) 
    return (dd2.year - dd1.year)*12 + dd2.month - dd1.month 

In [125]: months_between(pd.to_datetime('2015-01-02 12:13:14'), pd.to_datetime('2012-03-02 12:13:14')) 
Out[125]: 34 

OLD答案:

In [40]: (pd.to_datetime('15-10-2010') - pd.to_datetime('15-07-2010')).days 
Out[40]: 92 

你也可以幾個月做到這一點:

In [48]: pd.to_datetime('15-10-2010').month - pd.to_datetime('15-07-2010').month 
Out[48]: 3 
+0

超級!非常感謝!我是超級笨拙還是熊貓文檔真的很殘酷? –

+0

實際上,no:這個不適用於不同的年份,例如下面仍然返回3:pd.to_datetime('15-10-2015')。month - pd.to_datetime('15-07-2010')。month –

+0

這將是因爲你只使用'.month'屬性,並沒有真正考慮到這兩個日期之間有幾年的時間。 – Thanos

1

如果你環顧了一下,似乎是個不可能走出一個TimeDelta的:

In [193]: date_1 = pd.to_datetime('2015-01-02 12:13:14') 

In [194]: date_2 = pd.to_datetime('2012-03-02 12:13:14') 

In [195]: date_1 - date_2 
Out[195]: Timedelta('1036 days 00:00:00') 

In [199]: td_1. 
td_1.asm8   td_1.days   td_1.freq   td_1.microseconds td_1.resolution  td_1.to_pytimedelta td_1.value   
td_1.ceil   td_1.delta   td_1.is_populated td_1.min    td_1.round   td_1.to_timedelta64 td_1.view    
td_1.components  td_1.floor   td_1.max    td_1.nanoseconds  td_1.seconds   td_1.total_seconds 

In [199]: td_1.components 
Out[199]: Components(days=1036, hours=0, minutes=0, seconds=0, milliseconds=0, microseconds=0, nanoseconds=0) 

此外,Components不提供看似相同值的不同面值,但

In [213]: td_1.components.days 
Out[213]: 1036 

In [214]: td_1.components.hours 
Out[214]: 0 

最後,似乎有什麼你一直在做直到現在似乎是「最佳」的解決方案:

In [214]: td_1.components.days/30 
Out[214]: 34.53333333333333 

In [215]: np.round(td_1.components.days/30) 
Out[215]: 35.0 

In [216]: np.floor(td_1.components.days/30) 
Out[216]: 34.0 

真的不是好消息,而是無論如何都是一個解決方案。

至於比較matlab自帶的文檔對這個熊貓來說,你是對的。但是,如果您要比較兩者的價格標籤以及一些問題的答案。(?)

+0

當然,但我的觀點是,在商業環境中,時間就是金錢,而記錄不完整的產品的「自由」價格是虛假的經濟。我剛剛浪費了大約一個小時,試圖找出如何減去日期。如果存在一個大致具有熊貓功能和Matlab文檔質量的商業軟件,我會心動購買它 –

+0

同意,我敢打賭,你們很多人都在用類似的方式思考! – Thanos