折叠具有重叠日期的行

时间:2017-06-29 09:44:37

标签: python pandas

我正在尝试将以下数据框折叠为包含id的连续时间段的行。连续意味着,在同一id内,start_date小于,等于或最多比前一行的end_date大一天(数据已按ID排序) ,start_date和end_date)。所有连续的行应该作为单行输出,start_date是最小的start_date(即连续集中第一行的start_date),end_date是最大end_date从连续的行集。
请在底部看到所需的输出 我能想到的唯一方法是逐行解析数据帧,但我想知道是否有更多的 pythonic 和优雅的方法来实现它。

id  start_date  end_date
1   2017-01-01  2017-01-15
1   2017-01-12  2017-01-24
1   2017-01-25  2017-02-03
1   2017-02-05  2017-02-14
1   2017-02-16  2017-02-28
2   2017-01-01  2017-01-19
2   2017-01-24  2017-02-07
2   2017-02-07  2017-02-20

以下是生成输入数据帧的代码:

import numpy as np
import pandas as pd

start_date = ['2017-01-01','2017-01-12','2017-01-25','2017-02-05','2017-02-16',
              '2017-01-01','2017-01-24','2017-02-07']
end_date = ['2017-01-15','2017-01-24','2017-02-03','2017-02-14','2017-02-28',
            '2017-01-19','2017-02-07','2017-02-20']

df = pd.DataFrame({'id': [1,1,1,1,1,2,2,2],
                  'start_date': pd.to_datetime(start_date, format='%Y-%m-%d'),     
                  'end_date': pd.to_datetime(end_date, format='%Y-%m-%d')})

期望的输出:

id  start_date  end_date
1   2017-01-01  2017-02-03
1   2017-02-05  2017-02-14
1   2017-02-16  2017-02-28
2   2017-01-01  2017-01-19
2   2017-01-24  2017-02-20

1 个答案:

答案 0 :(得分:1)

#include<iostream>
using namespace std;
int main(){
    int a[10]={9,4,-3,-2,1,-1,5,7,-9,-5};
    int low=0;
    int high=10-1;
    while(low<high){
        while(a[low]>=0){
            low++;
        }
        while(a[high]<=0){
            high--;
        }
        if(low<high){
            int temp=a[low];
        a[low]=a[high];
        a[high]=temp;   
        }

    }
    for(int i=0;i<10;i++){
        cout<<a[i]<<" ";
    }
}
相关问题