2016-07-25 44 views
1

我有一個以不同範圍的日期重複的ID的大型列表。我需要創建一個唯一的ID列表,僅包含一個範圍的日期,其中包括未摺疊列表中的最早開始日期和最後結束日期。將列表摺疊爲日期範圍內的唯一ID

這是什麼,我有一個例子:

id start_date end_date 
    1 9/25/2015 10/12/2015 
    1 9/16/2015 11/1/2015 
    1 8/25/2015 9/21/2015 
    2 9/2/2015 10/29/2015 
    3 9/18/2015 10/15/2015 
    3 9/19/2015 9/30/2015 
    4 8/27/2015 9/15/2015 

而這正是我需要的。

id start_date end_date 
    1 8/25/2015 11/1/2015 
    2 9/2/2015 10/29/2015 
    3 9/18/2015 10/15/2015 
    4 8/27/2015 9/15/2015 

我想在Python中得到這個,但沒有太多的運氣。謝謝!

回答

2

使用groupby/aggregate

In [12]: df.groupby('id').agg({'start_date':min, 'end_date':max}) 
Out[12]: 
    start_date end_date 
id      
1 2015-08-25 2015-11-01 
2 2015-09-02 2015-10-29 
3 2015-09-18 2015-10-15 
4 2015-08-27 2015-09-15 

注意,重要的是,start_dateend_date被解析爲日期,讓minmax返回每個id的最小和最大日期秒。如果這些值僅僅是日期的字符串表示,那麼minmax會給出字符串 min或max,這取決於字符串的字典順序。如果日期字符串格式爲YYYY/MM/DD,那麼字典順序將與解析日期順序相對應,但MM/DD/YYYY格式的日期字符串不具有此屬性。

如果start_dateend_date有字符串值,然後

for col in ['start_date', 'end_date']: 
    df[col] = pd.to_datetime(df[col]) 

將字符串轉換成日期。

如果您加載使用pd.read_table(或pd.read_csv)從文件數據框,然後

df = pd.read_table(filename, ..., parse_dates=[1, 2]) 

將解析的文件日期的第二和第三列的字符串。由於Python使用基於0的索引,因此[1, 2]對應於第二列和第三列。