删除日期不属于任何日期范围的行

时间:2017-04-26 15:37:32

标签: python date pandas

所以我有一个2列数据框var sheet = document.createElement('style'), $rangeInput = $('.range'), prefs = ['webkit-slider-runnable-track', 'moz-range-track', 'ms-track']; document.body.appendChild(sheet); var getTrackStyle = function (el) { var curVal = el.value, style = ''; for (var i = 0; i < prefs.length; i++) { style += '.range::-' + prefs[i] + '{background: linear-gradient(to right, #34495e 0%, #34495e ' + curVal*20 + '%, #fff ' + curVal + '%, #fff 100%)}'; } return style; } $rangeInput.on('input', function () { sheet.textContent = getTrackStyle(this); }); datetime,我想删除所有不属于至少一个日期范围的行。

E.g。假设我的有效日期范围表示为元组

value

我有一个数据框

valid_date_ranges = [
                        (2017-01-01 00:00:00.00, 2017-01-03 15:00:00.00),
                        (2017-01-04 03:25:00.00, 2017-01-06 22:56:00.00),
                        ...
                    ]

我想删除最后带星号的行,因为它们不属于任何日期范围。

2 个答案:

答案 0 :(得分:0)

这是一种方法:

# sample df and ranges to exclude, per OP
datetime                value
"2017-01-01 00:00:00.00"  1234
"2017-01-01 00:01:00.00"  13241526
"2017-01-01 10:02:00.00"  356356
"2017-01-01 10:03:00.00"  17435
"2017-01-01 10:04:00.00"  5234515
"2017-01-01 10:05:00.00"  52452435
"2017-01-03 14:59:00.00"  156256
"2017-01-03 15:00:00.00"  665654
"2017-01-03 15:01:00.00"  890656      
"2017-01-03 15:02:00.00"  698765      
"2017-01-03 15:03:00.00"  6574    
"2017-01-04 03:23:00.00"  6541632     
"2017-01-04 03:24:00.00"  1234
"2017-01-04 03:25:00.00"  4657347
"2017-01-04 03:26:00.00"  765
"2017-01-04 03:27:00.00"  870089

df = pd.read_clipboard(parse_dates=True, index_col='datetime')

valid_date_ranges = [("2017-01-01 00:00:00.00", "2017-01-03 15:00:00.00"),
                    ("2017-01-04 03:25:00.00", "2017-01-06 22:56:00.00")]
dranges = [pd.date_range(start, end, freq='min') for start, end in valid_date_ranges]

现在删除在日期范围内找不到的行,并在新的filtered数据框中构建剩余的行:

filtered = pd.DataFrame()
for drange in dranges:
    filtered = pd.concat([filtered,df.drop(df.index[~df.index.isin(drange)])])

print(filtered)
                        value
datetime                     
2017-01-01 00:00:00      1234
2017-01-01 00:01:00  13241526
2017-01-01 10:02:00    356356
2017-01-01 10:03:00     17435
2017-01-01 10:04:00   5234515
2017-01-01 10:05:00  52452435
2017-01-03 14:59:00    156256
2017-01-03 15:00:00    665654
2017-01-04 03:25:00   4657347
2017-01-04 03:26:00       765
2017-01-04 03:27:00    870089

答案 1 :(得分:-1)

这是另一种方法。

制作数据框

valid_date_ranges = [('2017-01-01 00:00:00.00', '2017-01-03 15:00:00.00'),
                     ('2017-01-04 03:25:00.00', '2017-01-06 22:56:00.00'),
                    ]
df=pd.DataFrame({'datetime':
                   [
                    '2017-01-01 00:00:00.00',  
                    '2017-01-03 00:01:00.00',  
                    '2017-01-03 15:00:00.00',  
                    '2017-01-04 01:03:00.00',
                    '2017-01-04 02:03:00.00',
                    '2017-01-04 03:25:00.00',
                    '2017-01-06 22:56:00.00',
                    '2017-01-06 23:56:00.00',
                            ],
                    'value':[1234,1324,1526,
                             356356,
                             17435,5234,515,52452435]})    
df=df.sort_values('datetime').set_index('datetime')

将行标记为*

for i,idx in enumerate(df.index):
    for r in valid_date_ranges:
        if r[0]==idx:
            star=True
            break
        elif r[1]==df.index[i-1]:
            star=False
            break
        else:
            star=True
    if star:
        df.loc[idx,'star']='*'

输出:

                           value star
datetime                             
2017-01-01 00:00:00.00      1234    *
2017-01-03 00:01:00.00      1324    *
2017-01-03 15:00:00.00      1526    *
2017-01-04 01:03:00.00    356356  NaN
2017-01-04 02:03:00.00     17435    *
2017-01-04 03:25:00.00      5234    *
2017-01-06 22:56:00.00       515    *
2017-01-06 23:56:00.00  52452435  NaN

删除星号

的行
df=df.loc[df.loc[:,'star']!="*",:]

输出:

                           value star
datetime                             
2017-01-04 01:03:00.00    356356  NaN
2017-01-06 23:56:00.00  52452435  NaN