Skip to content

Commit 74fdbaa

Browse files
committed
Merge remote branch 'chang/to-timestamp'
* chang/to-timestamp: BUG: add same to_timestamp change to PeriodIndex BUG: change default frequency for to_timestamp BUG: start_time end_time to_timestamp bugs #2124 #2125 #1764
2 parents 06cf604 + 21a2632 commit 74fdbaa

File tree

2 files changed

+52
-39
lines changed

2 files changed

+52
-39
lines changed

pandas/tseries/period.py

+24-22
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from datetime import datetime, date
55
import numpy as np
66

7-
from pandas.tseries.frequencies import (get_freq_code as _gfc, to_offset,
7+
import pandas.tseries.offsets as offsets
8+
from pandas.tseries.frequencies import (get_freq_code as _gfc,
89
_month_numbers, FreqGroup)
910
from pandas.tseries.index import DatetimeIndex, Int64Index, Index
1011
from pandas.tseries.tools import parse_time_string
@@ -180,19 +181,21 @@ def asfreq(self, freq, how='E'):
180181

181182
@property
182183
def start_time(self):
183-
return self.to_timestamp(how='S')
184+
return self.to_timestamp('s', how='S')
184185

185186
@property
186187
def end_time(self):
187-
return self.to_timestamp(how='E')
188+
return self.to_timestamp('s', how='E')
188189

189-
def to_timestamp(self, freq=None, how='S'):
190+
def to_timestamp(self, freq=None, how='start'):
190191
"""
191-
Return the Timestamp at the start/end of the period
192+
Return the Timestamp representation of the Period at the target
193+
frequency at the specified end (how) of the Period
192194
193195
Parameters
194196
----------
195-
freq : string or DateOffset, default frequency of PeriodIndex
197+
freq : string or DateOffset, default is 'D' if self.freq is week or
198+
longer and 'S' otherwise
196199
Target frequency
197200
how: str, default 'S' (start)
198201
'S', 'E'. Can be aliased as case insensitive
@@ -202,20 +205,16 @@ def to_timestamp(self, freq=None, how='S'):
202205
-------
203206
Timestamp
204207
"""
208+
how = _validate_end_alias(how)
209+
205210
if freq is None:
206211
base, mult = _gfc(self.freq)
207-
how = _validate_end_alias(how)
208-
if how == 'S':
209-
base = _freq_mod.get_to_timestamp_base(base)
210-
freq = _freq_mod._get_freq_str(base)
211-
new_val = self.asfreq(freq, how)
212-
else:
213-
new_val = self
214-
else:
215-
base, mult = _gfc(freq)
216-
new_val = self.asfreq(freq, how)
212+
freq = _freq_mod.get_to_timestamp_base(base)
213+
214+
base, mult = _gfc(freq)
215+
val = self.asfreq(freq, how)
217216

218-
dt64 = plib.period_ordinal_to_dt64(new_val.ordinal, base)
217+
dt64 = plib.period_ordinal_to_dt64(val.ordinal, base)
219218
return Timestamp(dt64)
220219

221220
year = _period_field_accessor('year', 0)
@@ -765,20 +764,23 @@ def to_timestamp(self, freq=None, how='start'):
765764
766765
Parameters
767766
----------
768-
freq : string or DateOffset, default 'D'
767+
freq : string or DateOffset, default 'D' for week or longer, 'S'
768+
otherwise
769769
Target frequency
770770
how : {'s', 'e', 'start', 'end'}
771771
772772
Returns
773773
-------
774774
DatetimeIndex
775775
"""
776+
how = _validate_end_alias(how)
777+
776778
if freq is None:
777779
base, mult = _gfc(self.freq)
778-
new_data = self
779-
else:
780-
base, mult = _gfc(freq)
781-
new_data = self.asfreq(freq, how)
780+
freq = _freq_mod.get_to_timestamp_base(base)
781+
782+
base, mult = _gfc(freq)
783+
new_data = self.asfreq(freq, how)
782784

783785
new_data = plib.periodarr_to_dt64arr(new_data.values, base)
784786
return DatetimeIndex(new_data, freq='infer', name=self.name)

pandas/tseries/tests/test_period.py

+28-17
Original file line numberDiff line numberDiff line change
@@ -215,12 +215,12 @@ def test_to_timestamp(self):
215215
start_ts = p.to_timestamp(how='S')
216216
aliases = ['s', 'StarT', 'BEGIn']
217217
for a in aliases:
218-
self.assertEquals(start_ts, p.to_timestamp(how=a))
218+
self.assertEquals(start_ts, p.to_timestamp('D', how=a))
219219

220220
end_ts = p.to_timestamp(how='E')
221221
aliases = ['e', 'end', 'FINIsH']
222222
for a in aliases:
223-
self.assertEquals(end_ts, p.to_timestamp(how=a))
223+
self.assertEquals(end_ts, p.to_timestamp('D', how=a))
224224

225225
from_lst = ['A', 'Q', 'M', 'W', 'B',
226226
'D', 'H', 'Min', 'S']
@@ -231,7 +231,7 @@ def test_to_timestamp(self):
231231

232232
self.assertEquals(p.start_time, p.to_timestamp(how='S'))
233233

234-
self.assertEquals(p.end_time, p.to_timestamp(how='E'))
234+
self.assertEquals(p.end_time, p.to_timestamp('s', how='E'))
235235

236236
# Frequency other than daily
237237

@@ -245,8 +245,8 @@ def test_to_timestamp(self):
245245
expected = datetime(1985, 12, 31, 23, 59)
246246
self.assertEquals(result, expected)
247247

248-
result = p.to_timestamp('S', how='end')
249-
expected = datetime(1985, 12, 31, 23, 59, 59)
248+
result = p.to_timestamp(how='end')
249+
expected = datetime(1985, 12, 31)
250250
self.assertEquals(result, expected)
251251

252252
expected = datetime(1985, 1, 1)
@@ -272,28 +272,30 @@ def test_start_time(self):
272272

273273
def test_end_time(self):
274274
p = Period('2012', freq='A')
275-
xp = datetime(2012, 12, 31)
275+
xp = datetime(2012, 12, 31, 23, 59, 59)
276276
self.assertEquals(xp, p.end_time)
277277

278278
p = Period('2012', freq='Q')
279-
xp = datetime(2012, 3, 31)
279+
xp = datetime(2012, 3, 31, 23, 59, 59)
280280
self.assertEquals(xp, p.end_time)
281281

282282
p = Period('2012', freq='M')
283-
xp = datetime(2012, 1, 31)
283+
xp = datetime(2012, 1, 31, 23, 59, 59)
284284
self.assertEquals(xp, p.end_time)
285285

286-
xp = datetime(2012, 1, 1)
287-
freq_lst = ['D', 'H', 'T', 'S']
288-
for f in freq_lst:
289-
p = Period('2012', freq=f)
290-
self.assertEquals(p.end_time, xp)
286+
xp = datetime(2012, 1, 1, 23, 59, 59)
287+
p = Period('2012', freq='D')
288+
self.assertEquals(p.end_time, xp)
289+
290+
xp = datetime(2012, 1, 1, 0, 59, 59)
291+
p = Period('2012', freq='H')
292+
self.assertEquals(p.end_time, xp)
291293

292294
self.assertEquals(Period('2012', freq='B').end_time,
293-
datetime(2011, 12, 30))
295+
datetime(2011, 12, 30, 23, 59, 59))
294296

295297
self.assertEquals(Period('2012', freq='W').end_time,
296-
datetime(2012, 1, 1))
298+
datetime(2012, 1, 1, 23, 59, 59))
297299

298300

299301
def test_properties_annually(self):
@@ -1200,12 +1202,12 @@ def test_to_timestamp(self):
12001202
series = Series(1, index=index, name='foo')
12011203

12021204
exp_index = date_range('1/1/2001', end='12/31/2009', freq='A-DEC')
1203-
result = series.to_timestamp('D', 'end')
1205+
result = series.to_timestamp(how='end')
12041206
self.assert_(result.index.equals(exp_index))
12051207
self.assertEquals(result.name, 'foo')
12061208

12071209
exp_index = date_range('1/1/2001', end='1/1/2009', freq='AS-DEC')
1208-
result = series.to_timestamp('D', 'start')
1210+
result = series.to_timestamp(how='start')
12091211
self.assert_(result.index.equals(exp_index))
12101212

12111213

@@ -1230,6 +1232,15 @@ def _get_with_delta(delta, freq='A-DEC'):
12301232

12311233
self.assertRaises(ValueError, index.to_timestamp, '5t')
12321234

1235+
index = PeriodIndex(freq='H', start='1/1/2001', end='1/2/2001')
1236+
series = Series(1, index=index, name='foo')
1237+
1238+
exp_index = date_range('1/1/2001 00:59:59', end='1/2/2001 00:59:59',
1239+
freq='H')
1240+
result = series.to_timestamp(how='end')
1241+
self.assert_(result.index.equals(exp_index))
1242+
self.assertEquals(result.name, 'foo')
1243+
12331244
def test_to_timestamp_quarterly_bug(self):
12341245
years = np.arange(1960, 2000).repeat(4)
12351246
quarters = np.tile(range(1, 5), 40)

0 commit comments

Comments
 (0)