1
1
from datetime import datetime , timedelta
2
+ import functools
2
3
import inspect
3
4
import re
4
5
from typing import TYPE_CHECKING , Any , List , Optional
@@ -1127,6 +1128,7 @@ def interpolate(
1127
1128
axis = axis ,
1128
1129
inplace = inplace ,
1129
1130
limit = limit ,
1131
+ limit_area = limit_area ,
1130
1132
fill_value = fill_value ,
1131
1133
coerce = coerce ,
1132
1134
downcast = downcast ,
@@ -1155,6 +1157,7 @@ def _interpolate_with_fill(
1155
1157
axis : int = 0 ,
1156
1158
inplace : bool = False ,
1157
1159
limit : Optional [int ] = None ,
1160
+ limit_area : Optional [str ] = None ,
1158
1161
fill_value : Optional [Any ] = None ,
1159
1162
coerce : bool = False ,
1160
1163
downcast : Optional [str ] = None ,
@@ -1176,15 +1179,42 @@ def _interpolate_with_fill(
1176
1179
# We only get here for non-ExtensionBlock
1177
1180
fill_value = convert_scalar_for_putitemlike (fill_value , self .values .dtype )
1178
1181
1179
- values = missing . interpolate_2d (
1180
- values ,
1182
+ interpolate_2d = functools . partial (
1183
+ missing . interpolate_2d ,
1181
1184
method = method ,
1182
- axis = axis ,
1183
1185
limit = limit ,
1184
1186
fill_value = fill_value ,
1185
1187
dtype = self .dtype ,
1186
1188
)
1187
1189
1190
+ if limit_area is None :
1191
+ values = interpolate_2d (values , axis = axis )
1192
+ else :
1193
+ def func (values ):
1194
+ invalid = isna (values )
1195
+
1196
+ if not invalid .any ():
1197
+ return values
1198
+
1199
+ if not invalid .all ():
1200
+ first = missing .find_valid_index (values , "first" )
1201
+ last = missing .find_valid_index (values , "last" )
1202
+
1203
+ values = interpolate_2d (values )
1204
+
1205
+ if limit_area == "inside" :
1206
+ invalid [first : last + 1 ] = False
1207
+ elif limit_area == "outside" :
1208
+ invalid [:first ] = False
1209
+ invalid [last + 1 :] = False
1210
+
1211
+ values [invalid ] = np .nan
1212
+ else :
1213
+ values = interpolate_2d (values )
1214
+ return values
1215
+
1216
+ values = np .apply_along_axis (func , axis , values )
1217
+
1188
1218
blocks = [self .make_block_same_class (values , ndim = self .ndim )]
1189
1219
return self ._maybe_downcast (blocks , downcast )
1190
1220
0 commit comments