Skip to content

Commit ddcc30a

Browse files
changhiskhanwesm
authored andcommitted
BUG: start_time on Period fix #1857
1 parent 51b9844 commit ddcc30a

File tree

4 files changed

+61
-7
lines changed

4 files changed

+61
-7
lines changed

pandas/io/sql.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def read_frame(sql, con, index_col=None, coerce_float=True):
152152

153153
frame_query = read_frame
154154

155-
def write_frame(frame, name=None, con=None, flavor='sqlite'):
155+
def write_frame(frame, name=None, con=None, flavor='sqlite', append=False):
156156
"""
157157
Write records stored in a DataFrame to SQLite. The index will currently be
158158
dropped
@@ -162,13 +162,19 @@ def write_frame(frame, name=None, con=None, flavor='sqlite'):
162162
else:
163163
raise NotImplementedError
164164

165-
con.execute(schema)
165+
if not append and not has_table(name, con):
166+
con.execute(schema)
166167

167168
wildcards = ','.join(['?'] * len(frame.columns))
168169
insert_sql = 'INSERT INTO %s VALUES (%s)' % (name, wildcards)
169170
data = [tuple(x) for x in frame.values]
170171
con.executemany(insert_sql, data)
171172

173+
def has_table(name, con):
174+
sqlstr = "SELECT name FROM sqlite_master WHERE type='table' AND name='%s'" % name
175+
rs = tquery(sqlstr, con)
176+
return len(rs) > 0
177+
172178
def get_sqlite_schema(frame, name, dtypes=None, keys=None):
173179
template = """
174180
CREATE TABLE %(name)s (

pandas/tseries/frequencies.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ class FreqGroup(object):
2020
FR_MIN = 8000
2121
FR_SEC = 9000
2222

23+
def get_to_timestamp_base(base):
24+
if base <= FreqGroup.FR_WK:
25+
return FreqGroup.FR_DAY
26+
if FreqGroup.FR_HR <= base <= FreqGroup.FR_SEC:
27+
return FreqGroup.FR_SEC
28+
return base
29+
2330
def get_freq_group(freq):
2431
if isinstance(freq, basestring):
2532
base, mult = get_freq_code(freq)

pandas/tseries/period.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#---------------
2020
# Period logic
2121

22-
2322
def _period_field_accessor(name, alias):
2423
def f(self):
2524
base, mult = _gfc(self.freq)
@@ -201,14 +200,19 @@ def to_timestamp(self, freq=None, how='S'):
201200
"""
202201
if freq is None:
203202
base, mult = _gfc(self.freq)
204-
new_val = self
203+
how = _validate_end_alias(how)
204+
if how == 'S':
205+
base = _freq_mod.get_to_timestamp_base(base)
206+
freq = _freq_mod._get_freq_str(base)
207+
new_val = self.asfreq(freq, how)
208+
else:
209+
new_val = self
205210
else:
206211
base, mult = _gfc(freq)
207212
new_val = self.asfreq(freq, how)
208213

209214
dt64 = plib.period_ordinal_to_dt64(new_val.ordinal, base)
210-
ts_freq = _period_rule_to_timestamp_rule(new_val.freq, how=how)
211-
return Timestamp(dt64, offset=to_offset(ts_freq))
215+
return Timestamp(dt64)
212216

213217
year = _period_field_accessor('year', 0)
214218
month = _period_field_accessor('month', 3)

pandas/tseries/tests/test_period.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def test_period_cons_annual(self):
6262
for month in MONTHS:
6363
freq = 'A-%s' % month
6464
exp = Period('1989', freq=freq)
65-
stamp = exp.to_timestamp('D', how='end') + 30
65+
stamp = exp.to_timestamp('D', how='end') + timedelta(days=30)
6666
p = Period(stamp, freq=freq)
6767
self.assertEquals(p, exp + 1)
6868

@@ -259,6 +259,43 @@ def test_to_timestamp(self):
259259

260260
self.assertRaises(ValueError, p.to_timestamp, '5t')
261261

262+
def test_start_time(self):
263+
freq_lst = ['A', 'Q', 'M', 'D', 'H', 'T', 'S']
264+
xp = datetime(2012, 1, 1)
265+
for f in freq_lst:
266+
p = Period('2012', freq=f)
267+
self.assertEquals(p.start_time, xp)
268+
self.assertEquals(Period('2012', freq='B').start_time,
269+
datetime(2011, 12, 30))
270+
self.assertEquals(Period('2012', freq='W').start_time,
271+
datetime(2011, 12, 26))
272+
273+
def test_end_time(self):
274+
p = Period('2012', freq='A')
275+
xp = datetime(2012, 12, 31)
276+
self.assertEquals(xp, p.end_time)
277+
278+
p = Period('2012', freq='Q')
279+
xp = datetime(2012, 3, 31)
280+
self.assertEquals(xp, p.end_time)
281+
282+
p = Period('2012', freq='M')
283+
xp = datetime(2012, 1, 31)
284+
self.assertEquals(xp, p.end_time)
285+
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)
291+
292+
self.assertEquals(Period('2012', freq='B').end_time,
293+
datetime(2011, 12, 30))
294+
295+
self.assertEquals(Period('2012', freq='W').end_time,
296+
datetime(2012, 1, 1))
297+
298+
262299
def test_properties_annually(self):
263300
# Test properties on Periods with annually frequency.
264301
a_date = Period(freq='A', year=2007)

0 commit comments

Comments
 (0)