简体   繁体   English

Pandas - 如何将数据框中的日期范围拆分为额外的列

[英]Pandas - How to split date range in dataframe as extra columns

Dataset数据集

   sample = {'operator': ['op_a',
  'op_a',
  'op_a',
  'op_a',
  'op_b',
  'op_b',
  'op_b',
  'op_b',
  'op_c',
  'op_c',
  'op_c',
  'op_c'],
 'from': ['a', 'a', 'a', 'a', 'c', 'c', 'c', 'c', 'a', 'a', 'a', 'a'],
 'to': ['b', 'b', 'b', 'b', 'd', 'd', 'd', 'd', 'b', 'b', 'b', 'b'],
 'valid_from': ['13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '15/02/2019',
  '15/02/2019',
  '15/02/2019',
  '15/02/2019'],
 'valid_to': ['19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '21/02/2019',
  '21/02/2019',
  '21/02/2019',
  '21/02/2019']}

df_test = pd.DataFrame(sample)
df_test

I want to be able to split the valid_from and valid_to columns into their individual dates and added into the dataframe.我希望能够将valid_fromvalid_to列拆分为各自的日期并添加到数据valid_to

Output输出

    df3 = pd.DataFrame({'operator': ['op_a',
  'op_a',
  'op_a',
  'op_a',
  'op_b',
  'op_b',
  'op_b',
  'op_b',
  'op_c',
  'op_c',
  'op_c',
  'op_c'],
 'from': ['a', 'a', 'a', 'a', 'c', 'c', 'c', 'c', 'a', 'a', 'a', 'a'],
 'to': ['b', 'b', 'b', 'b', 'd', 'd', 'd', 'd', 'b', 'b', 'b', 'b'],
 'valid_from': ['13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '13/11/2018',
  '15/02/2019',
  '15/02/2019',
  '15/02/2019',
  '15/02/2019'],
 'valid_1': ['14/11/2018',
  '14/11/2018',
  '14/11/2018',
  '14/11/2018',
  '14/11/2018',
  '14/11/2018',
  '14/11/2018',
  '14/11/2018',
  '16/02/2019',
  '16/02/2019',
  '16/02/2019',
  '16/02/2019'],
 'valid_2': ['15/11/2018',
  '15/11/2018',
  '15/11/2018',
  '15/11/2018',
  '15/11/2018',
  '15/11/2018',
  '15/11/2018',
  '15/11/2018',
  '17/02/2019',
  '17/02/2019',
  '17/02/2019',
  '17/02/2019'],
 'valid_3': ['16/11/2018',
  '16/11/2018',
  '16/11/2018',
  '16/11/2018',
  '16/11/2018',
  '16/11/2018',
  '16/11/2018',
  '16/11/2018',
  '18/02/2019',
  '18/02/2019',
  '18/02/2019',
  '18/02/2019'],
 'valid_4': ['17/11/2018',
  '17/11/2018',
  '17/11/2018',
  '17/11/2018',
  '17/11/2018',
  '17/11/2018',
  '17/11/2018',
  '17/11/2018',
  '19/02/2019',
  '19/02/2019',
  '19/02/2019',
  '19/02/2019'],
 'valid_5': ['18/11/2018',
  '18/11/2018',
  '18/11/2018',
  '18/11/2018',
  '18/11/2018',
  '18/11/2018',
  '18/11/2018',
  '18/11/2018',
  '20/02/2019',
  '20/02/2019',
  '20/02/2019',
  '20/02/2019'],
 'valid_to': ['19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '19/11/2018',
  '21/02/2019',
  '21/02/2019',
  '21/02/2019',
  '21/02/2019']})

df2

You can try with:您可以尝试:

df_test['valid_from'] = pd.to_datetime(df_test['valid_from'])
df_test['valid_to'] = pd.to_datetime(df_test['valid_to'])
diff_days = int((df_test.loc[0,'valid_to'] - df_test.loc[0,'valid_from']).days)
for i in range(diff_days-1):
    df_test['valid_{}'.format(i+1)]= pd.DatetimeIndex(df_test['valid_from']) + pd.DateOffset(i+1)

This solution assumes that all rows have the same difference of days since it is not specified otherwise.此解决方案假定所有行都具有相同的天数差异,因为未另行指定。

Output:输出:

   from operator to valid_from    valid_to    valid_1    valid_2    valid_3  \
0     a     op_a  b 2018-11-13  19/11/2018 2018-11-14 2018-11-15 2018-11-16   
1     a     op_a  b 2018-11-13  19/11/2018 2018-11-14 2018-11-15 2018-11-16   
2     a     op_a  b 2018-11-13  19/11/2018 2018-11-14 2018-11-15 2018-11-16   
3     a     op_a  b 2018-11-13  19/11/2018 2018-11-14 2018-11-15 2018-11-16   
4     c     op_b  d 2018-11-13  19/11/2018 2018-11-14 2018-11-15 2018-11-16   
5     c     op_b  d 2018-11-13  19/11/2018 2018-11-14 2018-11-15 2018-11-16   
6     c     op_b  d 2018-11-13  19/11/2018 2018-11-14 2018-11-15 2018-11-16   
7     c     op_b  d 2018-11-13  19/11/2018 2018-11-14 2018-11-15 2018-11-16   
8     a     op_c  b 2019-02-15  21/02/2019 2019-02-16 2019-02-17 2019-02-18   
9     a     op_c  b 2019-02-15  21/02/2019 2019-02-16 2019-02-17 2019-02-18   
10    a     op_c  b 2019-02-15  21/02/2019 2019-02-16 2019-02-17 2019-02-18   
11    a     op_c  b 2019-02-15  21/02/2019 2019-02-16 2019-02-17 2019-02-18   

      valid_4    valid_5  
0  2018-11-17 2018-11-18  
1  2018-11-17 2018-11-18  
2  2018-11-17 2018-11-18  
3  2018-11-17 2018-11-18  
4  2018-11-17 2018-11-18  
5  2018-11-17 2018-11-18  
6  2018-11-17 2018-11-18  
7  2018-11-17 2018-11-18  
8  2019-02-19 2019-02-20  
9  2019-02-19 2019-02-20  
10 2019-02-19 2019-02-20  
11 2019-02-19 2019-02-20  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM