Skip to content

Commit cf1deaf

Browse files
srf94bmoscon
authored andcommitted
Give dates correct tzinfo after mongo query (pandas-dev#556)
1 parent ffa6fb0 commit cf1deaf

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

arctic/tickstore/toplevel.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,14 @@ def _get_libraries(self, date_range):
152152

153153
rtn = [TickStoreLibrary(self._arctic_lib.arctic[library.library], library.date_range)
154154
for library in libraries]
155-
current_start = rtn[-1].date_range.end if rtn else dt(1970, 1, 1, 0, 0) # epoch
155+
156+
if rtn:
157+
current_start = rtn[-1].date_range.end
158+
elif date_range.end.tzinfo:
159+
current_start = dt(1970, 1, 1, 0, 0, tzinfo=date_range.end.tzinfo)
160+
else:
161+
current_start = dt(1970, 1, 1, 0, 0)
162+
156163
if date_range.end is None or current_start < date_range.end:
157164
name = self.get_name()
158165
db_name, tick_type = name.split('.', 1)
@@ -195,8 +202,20 @@ def _get_library_metadata(self, date_range):
195202
query = {'$or': [{'start': {'$lte': start}, 'end': {'$gte': start}},
196203
{'start': {'$gte': start}, 'end': {'$lte': end}},
197204
{'start': {'$lte': end}, 'end': {'$gte': end}}]}
198-
return [TickStoreLibrary(res['library_name'], DateRange(res['start'], res['end'], CLOSED_CLOSED))
199-
for res in self._collection.find(query,
200-
projection={'library_name': 1,
201-
'start': 1, 'end': 1},
202-
sort=[('start', pymongo.ASCENDING)])]
205+
206+
cursor = self._collection.find(query,
207+
projection={'library_name': 1, 'start': 1, 'end': 1},
208+
sort=[('start', pymongo.ASCENDING)])
209+
210+
results = []
211+
for res in cursor:
212+
start = res['start']
213+
if date_range.start.tzinfo is not None and start.tzinfo is None:
214+
start = start.replace(tzinfo=mktz("UTC")).astimezone(tz=date_range.start.tzinfo)
215+
216+
end = res['end']
217+
if date_range.end.tzinfo is not None and end.tzinfo is None:
218+
end = end.replace(tzinfo=mktz("UTC")).astimezone(tz=date_range.end.tzinfo)
219+
220+
results.append(TickStoreLibrary(res['library_name'], DateRange(start, end, CLOSED_CLOSED)))
221+
return results

tests/integration/tickstore/test_toplevel.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,3 +242,31 @@ def test_no_min_max_date(arctic):
242242
tstore.min_date('unknown-symbol')
243243
with pytest.raises(NoDataFoundException):
244244
tstore.max_date('unknown-symbol')
245+
246+
247+
def test_get_libraries_no_data_raises_exception(toplevel_tickstore, arctic):
248+
date_range = DateRange(start=dt(2009, 1, 1), end=dt(2010, 12, 31, 23, 59, 59, 999000))
249+
with pytest.raises(NoDataFoundException):
250+
toplevel_tickstore._get_libraries(date_range)
251+
252+
253+
def test_get_libraries_no_data_raises_exception_tzinfo_given(toplevel_tickstore, arctic):
254+
tzinfo = mktz('Asia/Chongqing')
255+
date_range = DateRange(start=dt(2009, 1, 1, tzinfo=tzinfo),
256+
end=dt(2010, 12, 31, 23, 59, 59, 999000, tzinfo=tzinfo))
257+
with pytest.raises(NoDataFoundException):
258+
toplevel_tickstore._get_libraries(date_range)
259+
260+
261+
def test_get_library_metadata(arctic):
262+
arctic.initialize_library('FEED_2010.LEVEL1', tickstore.TICK_STORE_TYPE)
263+
arctic.initialize_library('FEED_2011.LEVEL1', tickstore.TICK_STORE_TYPE)
264+
arctic.initialize_library('FEED.LEVEL1', toplevel.TICK_STORE_TYPE)
265+
toplevel_tickstore = arctic['FEED.LEVEL1']
266+
267+
symbol = "USD"
268+
tzinfo=mktz('Asia/Chongqing')
269+
with pytest.raises(NoDataFoundException):
270+
toplevel_tickstore.read(symbol, DateRange(start=dt(2010, 1, 1, tzinfo=tzinfo),
271+
end=dt(2011, 1, 2, tzinfo=tzinfo)),
272+
columns=None)

0 commit comments

Comments
 (0)