@@ -2221,49 +2221,75 @@ def create_series(self):
2221
2221
return Series (np .arange (len (i )), index = i , name = 'pi' )
2222
2222
2223
2223
def test_asfreq_downsample (self ):
2224
+ # GH 12884, 15944
2224
2225
2225
- # series
2226
2226
s = self .create_series ()
2227
- expected = s .reindex (s .index .take (np .arange (0 , len (s .index ), 2 )))
2228
- expected .index = expected .index .to_timestamp ()
2229
- expected .index .freq = to_offset ('2D' )
2227
+ start = s .index [0 ].to_timestamp (how = 'start' )
2228
+ end = (s .index [- 1 ] + 1 ).to_timestamp (how = 'start' )
2230
2229
2231
- # this is a bug, this *should* return a PeriodIndex
2232
- # directly
2233
- # GH 12884
2230
+ new_index = date_range ( start = start , end = end , freq = '2D' , closed = 'left' )
2231
+ # series
2232
+ expected = s . to_timestamp (). reindex ( new_index ). to_period ( '2D' )
2234
2233
result = s .resample ('2D' ).asfreq ()
2235
2234
assert_series_equal (result , expected )
2235
+ result_kind_period = s .resample ('2D' , kind = 'period' ).asfreq ()
2236
+ assert_series_equal (result_kind_period , expected )
2236
2237
2237
2238
# frame
2238
2239
frame = s .to_frame ('value' )
2239
- expected = frame .reindex (
2240
- frame .index .take (np .arange (0 , len (frame .index ), 2 )))
2241
- expected .index = expected .index .to_timestamp ()
2242
- expected .index .freq = to_offset ('2D' )
2240
+ expected = frame .to_timestamp ().reindex (new_index ).to_period ('2D' )
2243
2241
result = frame .resample ('2D' ).asfreq ()
2244
2242
assert_frame_equal (result , expected )
2243
+ result_kind_period = frame .resample ('2D' , kind = 'period' ).asfreq ()
2244
+ assert_frame_equal (result_kind_period , expected )
2245
+
2246
+ def test_asfreq_downsample_kind_timestamp (self ):
2247
+ # series
2248
+ s = self .create_series ()
2249
+ expected = s .to_timestamp ().resample ('2D' ).asfreq ()
2250
+ result = s .resample ('2D' , kind = 'timestamp' ).asfreq ()
2251
+ assert_series_equal (result , expected )
2252
+
2253
+ # frame
2254
+ frame = s .to_frame ('value' )
2255
+ expected = frame .to_timestamp ().resample ('2D' ).asfreq ()
2256
+ result = frame .resample ('2D' , kind = 'timestamp' ).asfreq ()
2257
+ assert_frame_equal (result , expected )
2245
2258
2246
2259
def test_asfreq_upsample (self ):
2260
+ # GH 12884, 15944
2247
2261
2248
- # this is a bug, this *should* return a PeriodIndex
2249
- # directly
2250
- # GH 12884
2251
2262
s = self .create_series ()
2252
- new_index = date_range (s .index [0 ].to_timestamp (how = 'start' ),
2253
- (s .index [- 1 ] + 1 ).to_timestamp (how = 'start' ),
2254
- freq = '1H' ,
2255
- closed = 'left' )
2256
- expected = s .to_timestamp ().reindex (new_index ).to_period ()
2257
- result = s .resample ('1H' ).asfreq ()
2263
+ start = s .index [0 ].to_timestamp (how = 'start' )
2264
+ end = (s .index [- 1 ] + 1 ).to_timestamp (how = 'start' )
2265
+ for freq in ['1H' , '2H' ]:
2266
+ # check base frequency and frequency multiple
2267
+ new_index = date_range (start = start , end = end , freq = freq ,
2268
+ closed = 'left' )
2269
+ # series
2270
+ expected = s .to_timestamp ().reindex (new_index ).to_period (freq )
2271
+ result = s .resample (freq ).asfreq ()
2272
+ assert_series_equal (result , expected )
2273
+ result_kind_period = s .resample (freq , kind = 'period' ).asfreq ()
2274
+ assert_series_equal (result_kind_period , expected )
2275
+
2276
+ # frame
2277
+ frame = s .to_frame ('value' )
2278
+ expected = frame .to_timestamp ().reindex (new_index ).to_period (freq )
2279
+ result = frame .resample (freq ).asfreq ()
2280
+ assert_frame_equal (result , expected )
2281
+ result_kind_period = frame .resample (freq , kind = 'period' ).asfreq ()
2282
+ assert_frame_equal (result_kind_period , expected )
2283
+
2284
+ def test_asfreq_upsample_kind_timestamp (self ):
2285
+ s = self .create_series ()
2286
+ expected = s .to_timestamp ().resample ('1H' ).asfreq ()
2287
+ result = s .resample ('1H' , kind = 'timestamp' ).asfreq ()
2258
2288
assert_series_equal (result , expected )
2259
2289
2260
2290
frame = s .to_frame ('value' )
2261
- new_index = date_range (frame .index [0 ].to_timestamp (how = 'start' ),
2262
- (frame .index [- 1 ] + 1 ).to_timestamp (how = 'start' ),
2263
- freq = '1H' ,
2264
- closed = 'left' )
2265
- expected = frame .to_timestamp ().reindex (new_index ).to_period ()
2266
- result = frame .resample ('1H' ).asfreq ()
2291
+ expected = frame .to_timestamp ().resample ('1H' ).asfreq ()
2292
+ result = frame .resample ('1H' , kind = 'timestamp' ).asfreq ()
2267
2293
assert_frame_equal (result , expected )
2268
2294
2269
2295
def test_asfreq_fill_value (self ):
@@ -2375,12 +2401,11 @@ def test_basic_upsample(self):
2375
2401
ts = _simple_pts ('1/1/1990' , '6/30/1995' , freq = 'M' )
2376
2402
result = ts .resample ('a-dec' ).mean ()
2377
2403
2378
- resampled = result .resample ('D' , convention = 'end' ).ffill ()
2379
-
2380
- expected = result .to_timestamp ('D' , how = 'end' )
2381
- expected = expected .asfreq ('D' , 'ffill' ).to_period ()
2382
-
2383
- assert_series_equal (resampled , expected )
2404
+ for freq in ['D' , '2D' ]:
2405
+ resampled = result .resample (freq , convention = 'end' ).ffill ()
2406
+ expected = result .to_timestamp (freq , how = 'end' )
2407
+ expected = expected .asfreq (freq , 'ffill' ).to_period (freq )
2408
+ assert_series_equal (resampled , expected )
2384
2409
2385
2410
def test_upsample_with_limit (self ):
2386
2411
rng = period_range ('1/1/2000' , periods = 5 , freq = 'A' )
@@ -2451,10 +2476,13 @@ def test_resample_count(self):
2451
2476
series = pd .Series (1 , index = pd .period_range (start = '2000' ,
2452
2477
periods = 100 ))
2453
2478
result = series .resample ('M' ).count ()
2454
-
2455
2479
expected_index = pd .period_range (start = '2000' , freq = 'M' , periods = 4 )
2456
2480
expected = pd .Series ([31 , 29 , 31 , 9 ], index = expected_index )
2481
+ assert_series_equal (result , expected )
2457
2482
2483
+ result = series .resample ('2M' ).count ()
2484
+ expected_index = pd .period_range (start = '2000' , freq = '2M' , periods = 2 )
2485
+ expected = pd .Series ([31 + 29 , 31 + 9 ], index = expected_index )
2458
2486
assert_series_equal (result , expected )
2459
2487
2460
2488
def test_resample_same_freq (self ):
@@ -2596,7 +2624,17 @@ def test_resample_5minute(self):
2596
2624
rng = period_range ('1/1/2000' , '1/5/2000' , freq = 'T' )
2597
2625
ts = Series (np .random .randn (len (rng )), index = rng )
2598
2626
2627
+ expected = ts .to_timestamp ().resample ('5min' ).mean ().to_period ('5min' )
2599
2628
result = ts .resample ('5min' ).mean ()
2629
+ assert_series_equal (result , expected )
2630
+ result_kind_period = ts .resample ('5min' , kind = 'period' ).mean ()
2631
+ assert_series_equal (result_kind_period , expected )
2632
+
2633
+ def test_resample_5minute_kind_timestamp (self ):
2634
+ rng = period_range ('1/1/2000' , '1/5/2000' , freq = 'T' )
2635
+ ts = Series (np .random .randn (len (rng )), index = rng )
2636
+
2637
+ result = ts .resample ('5min' , kind = 'timestamp' ).mean ()
2600
2638
expected = ts .to_timestamp ().resample ('5min' ).mean ()
2601
2639
assert_series_equal (result , expected )
2602
2640
@@ -2824,6 +2862,33 @@ def test_apply_to_empty_series(self):
2824
2862
for freq in ['M' , 'D' , 'H' ]:
2825
2863
with pytest .raises (TypeError ):
2826
2864
series .resample (freq ).apply (lambda x : 1 )
2865
+ def test_loffset_returns_datetimeindex (self ):
2866
+ # make sure passing loffset returns DatetimeIndex in all cases
2867
+ # basic method taken from Base.test_resample_loffset_arg_type()
2868
+ df = self .create_series ().to_frame ('value' )
2869
+ expected_means = [df .values [i :i + 2 ].mean ()
2870
+ for i in range (0 , len (df .values ), 2 )]
2871
+ expected_index = self .create_index (df .index [0 ], periods = len (df .index ) /
2872
+ 2 , freq = '2D' )
2873
+
2874
+ # loffset coreces PeriodIndex to DateTimeIndex
2875
+ expected_index = expected_index .to_timestamp ()
2876
+ expected_index += timedelta (hours = 2 )
2877
+ expected = DataFrame ({'value' : expected_means }, index = expected_index )
2878
+
2879
+ for arg in ['mean' , {'value' : 'mean' }, ['mean' ]]:
2880
+ for kind_param in [None , 'period' , 'timestamp' ]:
2881
+ result_agg = (df .resample ('2D' , loffset = '2H' , kind = kind_param )
2882
+ .agg (arg ))
2883
+ with tm .assert_produces_warning (FutureWarning ,
2884
+ check_stacklevel = False ):
2885
+ result_how = df .resample ('2D' , how = arg , loffset = '2H' ,
2886
+ kind = kind_param )
2887
+ if isinstance (arg , list ):
2888
+ expected .columns = (pd .MultiIndex
2889
+ .from_tuples ([('value' , 'mean' )]))
2890
+ assert_frame_equal (result_agg , expected )
2891
+ assert_frame_equal (result_how , expected )
2827
2892
2828
2893
2829
2894
class TestTimedeltaIndex (Base ):
0 commit comments