【问题标题】:Python: Overlapping date ranges into time seriesPython:将日期范围重叠到时间序列中
【发布时间】:2020-05-06 23:54:57
【问题描述】:

我的数据集要大得多,所以我对其进行了简化。

我想将数据帧转换为时间序列。

我坚持的一点:

我有重叠的日期范围,其中我在一个较大的日期范围内有一个较小的日期范围,如第 0 行和第 1 行所示,其中第 1 行和第 2 行在第 0 行的日期范围内。

df:
        date1      date2      reduction
0  2016-01-01 - 2016-01-05       7.0
1  2016-01-02 - 2016-01-03       5.0
2  2016-01-03 - 2016-01-04       6.0
3  2016-01-05 - 2016-01-12       10.0

我希望输出的外观如何:

        date1      date2     reduction
0  2016-01-01 2016-01-02        7.0
1  2016-01-02 2016-01-03        5.0
2  2016-01-03 2016-01-04        6.0
3  2016-01-04 2016-01-05        7.0
4  2016-01-05 2016-01-06        10.0
5  2016-01-06 2016-01-07        10.0
6  2016-01-07 2016-01-08        10.0
7  2016-01-08 2016-01-09        10.0
8  2016-01-09 2016-01-10        10.0
9  2016-01-10 2016-01-11        10.0
10 2016-01-11 2016-01-12        10.0

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    我准备了两列具有最小和最大日期的连续数据,并从原始 DF 运行更新。

     import pandas as pd
     import numpy as np
     import io
    
    data='''
     date1 date2 reduction
    0 2016-01-01 2016-01-05 7.0
    1 2016-01-02 2016-01-03 5.0
    2 2016-01-03 2016-01-04 6.0
    3 2016-01-05 2016-01-12 10.0
    '''
    
    df = pd.read_csv(io.StringIO(data), sep=' ', index_col=0)
    
    date_1 = pd.date_range(df.date1.min(), df.date2.max())
    date_2 = pd.date_range(df.date1.min(), df.date2.max())
    
    df2 = pd.DataFrame({'date1':date_1, 'date2':date_2, 'reduction':[0]*len(date_1)})
    df2['date2'] = df2.date2.shift(-1)
    df2.dropna(inplace=True)
    
    for i in range(len(df)):
        df2['reduction'][(df2.date1 >= df.date1.iloc[i]) & (df2.date2 <= df.date2.iloc[i])] = df.reduction.iloc[i]
    
    df2
        date1   date2   reduction
    0   2016-01-01  2016-01-02  7
    1   2016-01-02  2016-01-03  5
    2   2016-01-03  2016-01-04  6
    3   2016-01-04  2016-01-05  7
    4   2016-01-05  2016-01-06  10
    5   2016-01-06  2016-01-07  10
    6   2016-01-07  2016-01-08  10
    7   2016-01-08  2016-01-09  10
    8   2016-01-09  2016-01-10  10
    9   2016-01-10  2016-01-11  10
    10  2016-01-11  2016-01-12  10
    

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 2014-09-04
      相关资源
      最近更新 更多