Skip to content

Commit c86e74a

Browse files
committed
Merge commit 'v0.9.0rc1-7-g8c0e206' into debian
* commit 'v0.9.0rc1-7-g8c0e206': BUG: fix Cython tz_convert bug with time zones that haven't had a UTC transition in a long time. close pandas-dev#1946 BUG: fix buglet BUG: try fixing tzlocal bug Minor fixes to time series doc. Adding DataFrame methods to API reference. Added Series functions to API doc. BUG: fix segfault in SeriesGrouper with non-contiguous index
2 parents ae16195 + 8c0e206 commit c86e74a

File tree

7 files changed

+134
-22
lines changed

7 files changed

+134
-22
lines changed

RELEASE.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ pandas 0.9.0
203203
partial-indexing a hierarchically-indexed DataFrame (#1796)
204204
- Support multiple column selection in DataFrame.__getitem__ with duplicate
205205
columns (#1943)
206+
- Fix time zone localization bug causing improper fields (e.g. hours) in time
207+
zones that have not had a UTC transition in a long time (#1946)
206208

207209
pandas 0.8.1
208210
============

doc/source/api.rst

Lines changed: 74 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ Binary operator functions
165165
Series.sub
166166
Series.combine
167167
Series.combine_first
168+
Series.round
168169

169170
Function application, GroupBy
170171
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -182,25 +183,37 @@ Computations / Descriptive Stats
182183
.. autosummary::
183184
:toctree: generated/
184185

186+
Series.abs
187+
Series.any
185188
Series.autocorr
189+
Series.between
186190
Series.clip
187191
Series.clip_lower
188192
Series.clip_upper
189193
Series.corr
190194
Series.count
195+
Series.cov
196+
Series.cummax
197+
Series.cummin
191198
Series.cumprod
192199
Series.cumsum
193200
Series.describe
194201
Series.diff
202+
Series.kurt
203+
Series.mad
195204
Series.max
196205
Series.mean
197206
Series.median
198207
Series.min
208+
Series.nunique
209+
Series.pct_change
199210
Series.prod
200211
Series.quantile
212+
Series.rank
201213
Series.skew
202214
Series.std
203215
Series.sum
216+
Series.unique
204217
Series.var
205218
Series.value_counts
206219

@@ -211,11 +224,19 @@ Reindexing / Selection / Label manipulation
211224

212225
Series.align
213226
Series.drop
227+
Series.first
228+
Series.head
229+
Series.idxmax
230+
Series.idxmin
231+
Series.isin
232+
Series.last
214233
Series.reindex
215234
Series.reindex_like
216235
Series.rename
236+
Series.reset_index
217237
Series.select
218238
Series.take
239+
Series.tail
219240
Series.truncate
220241

221242
Missing data handling
@@ -234,9 +255,11 @@ Reshaping, sorting
234255

235256
Series.argsort
236257
Series.order
258+
Series.reorder_levels
237259
Series.sort
238260
Series.sort_index
239261
Series.sortlevel
262+
Series.swaplevel
240263
Series.unstack
241264

242265
Combining / joining / merging
@@ -245,6 +268,8 @@ Combining / joining / merging
245268
:toctree: generated/
246269

247270
Series.append
271+
Series.replace
272+
Series.update
248273

249274
Time series-related
250275
~~~~~~~~~~~~~~~~~~~
@@ -257,6 +282,9 @@ Time series-related
257282
Series.first_valid_index
258283
Series.last_valid_index
259284
Series.weekday
285+
Series.resample
286+
Series.tz_convert
287+
Series.tz_localize
260288

261289
Plotting
262290
~~~~~~~~
@@ -277,6 +305,7 @@ Serialization / IO / Conversion
277305
Series.to_csv
278306
Series.to_dict
279307
Series.to_sparse
308+
Series.to_string
280309

281310
.. _api.dataframe:
282311

@@ -308,18 +337,24 @@ Conversion / Constructors
308337

309338
DataFrame.__init__
310339
DataFrame.astype
340+
DataFrame.convert_objects
311341
DataFrame.copy
312342

313343
Indexing, iteration
314344
~~~~~~~~~~~~~~~~~~~
315345
.. autosummary::
316346
:toctree: generated/
317347

348+
DataFrame.head
318349
DataFrame.ix
319350
DataFrame.insert
320351
DataFrame.__iter__
321352
DataFrame.iteritems
353+
DataFrame.iterrows
354+
DataFrame.itertuples
355+
DataFrame.lookup
322356
DataFrame.pop
357+
DataFrame.tail
323358
DataFrame.xs
324359

325360
Binary operator functions
@@ -356,23 +391,31 @@ Computations / Descriptive Stats
356391
.. autosummary::
357392
:toctree: generated/
358393

394+
DataFrame.abs
395+
DataFrame.any
359396
DataFrame.clip
360397
DataFrame.clip_lower
361398
DataFrame.clip_upper
362399
DataFrame.corr
363400
DataFrame.corrwith
364401
DataFrame.count
402+
DataFrame.cov
403+
DataFrame.cummax
404+
DataFrame.cummin
365405
DataFrame.cumprod
366406
DataFrame.cumsum
367407
DataFrame.describe
368408
DataFrame.diff
409+
DataFrame.kurt
369410
DataFrame.mad
370411
DataFrame.max
371412
DataFrame.mean
372413
DataFrame.median
373414
DataFrame.min
415+
DataFrame.pct_change
374416
DataFrame.prod
375417
DataFrame.quantile
418+
DataFrame.rank
376419
DataFrame.skew
377420
DataFrame.sum
378421
DataFrame.std
@@ -387,15 +430,24 @@ Reindexing / Selection / Label manipulation
387430
DataFrame.add_suffix
388431
DataFrame.align
389432
DataFrame.drop
433+
DataFrame.drop_duplicates
434+
DataFrame.duplicated
390435
DataFrame.filter
436+
DataFrame.first
437+
DataFrame.head
438+
DataFrame.idxmax
439+
DataFrame.idxmin
440+
DataFrame.last
391441
DataFrame.reindex
442+
DataFrame.reindex_axis
392443
DataFrame.reindex_like
393444
DataFrame.rename
445+
DataFrame.reset_index
394446
DataFrame.select
447+
DataFrame.set_index
448+
DataFrame.tail
395449
DataFrame.take
396450
DataFrame.truncate
397-
DataFrame.head
398-
DataFrame.tail
399451

400452
.. _api.dataframe.missing:
401453

@@ -412,24 +464,29 @@ Reshaping, sorting, transposing
412464
.. autosummary::
413465
:toctree: generated/
414466

415-
DataFrame.sort_index
416467
DataFrame.delevel
417468
DataFrame.pivot
469+
DataFrame.reorder_levels
470+
DataFrame.sort
471+
DataFrame.sort_index
418472
DataFrame.sortlevel
419473
DataFrame.swaplevel
420474
DataFrame.stack
421475
DataFrame.unstack
422476
DataFrame.T
477+
DataFrame.to_panel
423478
DataFrame.transpose
424479

425480
Combining / joining / merging
426481
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
427482
.. autosummary::
428483
:toctree: generated/
429484

485+
DataFrame.append
430486
DataFrame.join
431487
DataFrame.merge
432-
DataFrame.append
488+
DataFrame.replace
489+
DataFrame.update
433490

434491
Time series-related
435492
~~~~~~~~~~~~~~~~~~~
@@ -440,12 +497,18 @@ Time series-related
440497
DataFrame.shift
441498
DataFrame.first_valid_index
442499
DataFrame.last_valid_index
500+
DataFrame.resample
501+
DataFrame.to_period
502+
DataFrame.to_timestamp
503+
DataFrame.tz_convert
504+
DataFrame.tz_localize
443505

444506
Plotting
445507
~~~~~~~~
446508
.. autosummary::
447509
:toctree: generated/
448510

511+
DataFrame.boxplot
449512
DataFrame.hist
450513
DataFrame.plot
451514

@@ -455,16 +518,19 @@ Serialization / IO / Conversion
455518
:toctree: generated/
456519

457520
DataFrame.from_csv
521+
DataFrame.from_dict
522+
DataFrame.from_items
458523
DataFrame.from_records
524+
DataFrame.info
525+
DataFrame.load
526+
DataFrame.save
459527
DataFrame.to_csv
460-
DataFrame.to_excel
461528
DataFrame.to_dict
529+
DataFrame.to_excel
530+
DataFrame.to_html
462531
DataFrame.to_records
463532
DataFrame.to_sparse
464533
DataFrame.to_string
465-
DataFrame.save
466-
DataFrame.load
467-
DataFrame.info
468534

469535
.. _api.panel:
470536

doc/source/timeseries.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ to create timestamp indexes.
140140
index = bdate_range('2012-1-1', periods=250)
141141
index
142142
143-
Convenience functions like ``date_range`` and ``bdate_range`` utilizes a
143+
Convenience functions like ``date_range`` and ``bdate_range`` utilize a
144144
variety of frequency aliases. The default frequency for ``date_range`` is a
145145
**calendar day** while the default for ``bdate_range`` is a **business day**
146146

@@ -156,7 +156,7 @@ variety of frequency aliases. The default frequency for ``date_range`` is a
156156
rng
157157
158158
``date_range`` and ``bdate_range`` makes it easy to generate a range of dates
159-
using various combinations of its parameters like ``start``, ``end``,
159+
using various combinations of parameters like ``start``, ``end``,
160160
``periods``, and ``freq``:
161161

162162
.. ipython:: python
@@ -586,7 +586,7 @@ different parameters to control the frequency conversion and resampling
586586
operation.
587587

588588
The ``how`` parameter can be a function name or numpy array function that takes
589-
and array and produces an aggregated values:
589+
an array and produces aggregated values:
590590

591591
.. ipython:: python
592592

pandas/src/datetime.pyx

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -527,11 +527,11 @@ cdef class _TSObject:
527527
def __get__(self):
528528
return self.value
529529

530-
cpdef _get_utcoffset(tzinfo):
530+
cpdef _get_utcoffset(tzinfo, obj):
531531
try:
532532
return tzinfo._utcoffset
533533
except AttributeError:
534-
return tzinfo.utcoffset(None)
534+
return tzinfo.utcoffset(obj)
535535

536536
# helper to extract datetime and int64 from several different possibilities
537537
cpdef convert_to_tsobject(object ts, object tz=None):
@@ -570,20 +570,22 @@ cpdef convert_to_tsobject(object ts, object tz=None):
570570
ts = tz.normalize(ts)
571571
obj.value = _pydatetime_to_dts(ts, &obj.dts)
572572
obj.tzinfo = ts.tzinfo
573-
elif tz is not pytz.utc:
573+
elif not _is_utc(tz):
574574
ts = tz.localize(ts)
575575
obj.value = _pydatetime_to_dts(ts, &obj.dts)
576-
obj.value -= _delta_to_nanoseconds(_get_utcoffset(ts.tzinfo))
576+
offset = _get_utcoffset(ts.tzinfo, ts)
577+
obj.value -= _delta_to_nanoseconds(offset)
577578
obj.tzinfo = ts.tzinfo
578579
else:
579580
# UTC
580581
obj.value = _pydatetime_to_dts(ts, &obj.dts)
581-
obj.tzinfo = tz
582+
obj.tzinfo = pytz.utc
582583
else:
583584
obj.value = _pydatetime_to_dts(ts, &obj.dts)
584585
obj.tzinfo = ts.tzinfo
585586
if obj.tzinfo is not None and not _is_utc(obj.tzinfo):
586-
obj.value -= _delta_to_nanoseconds(_get_utcoffset(obj.tzinfo))
587+
offset = _get_utcoffset(obj.tzinfo, ts)
588+
obj.value -= _delta_to_nanoseconds(offset)
587589
_check_dts_bounds(obj.value, &obj.dts)
588590
return obj
589591
elif PyDate_Check(ts):
@@ -946,7 +948,7 @@ def tz_convert(ndarray[int64_t] vals, object tz1, object tz2):
946948
if pos == 0:
947949
raise ValueError('First time before start of DST info')
948950
elif pos == len(trans):
949-
return result + deltas[-1]
951+
return utc_dates + deltas[-1]
950952

951953
# TODO: this assumed sortedness :/
952954
pos -= 1
@@ -1015,6 +1017,11 @@ def _get_transitions(tz):
10151017
if hasattr(tz, '_utc_transition_times'):
10161018
arr = np.array(tz._utc_transition_times, dtype='M8[ns]')
10171019
arr = arr.view('i8')
1020+
try:
1021+
if tz._utc_transition_times[0].year == 1:
1022+
arr[0] = NPY_NAT + 1
1023+
except Exception:
1024+
pass
10181025
else:
10191026
arr = np.array([NPY_NAT + 1], dtype=np.int64)
10201027
trans_cache[tz] = arr
@@ -1028,15 +1035,15 @@ def _get_deltas(tz):
10281035
# tzoffset not hashable in Python 3
10291036
hash(tz)
10301037
except TypeError:
1031-
num = int(total_seconds(_get_utcoffset(tz))) * 1000000000
1038+
num = int(total_seconds(_get_utcoffset(tz, None))) * 1000000000
10321039
return np.array([num], dtype=np.int64)
10331040

10341041
if tz not in utc_offset_cache:
10351042
if hasattr(tz, '_utc_transition_times'):
10361043
utc_offset_cache[tz] = _unbox_utcoffsets(tz._transition_info)
10371044
else:
10381045
# static tzinfo
1039-
num = int(total_seconds(_get_utcoffset(tz))) * 1000000000
1046+
num = int(total_seconds(_get_utcoffset(tz, None))) * 1000000000
10401047
utc_offset_cache[tz] = np.array([num], dtype=np.int64)
10411048
return utc_offset_cache[tz]
10421049

0 commit comments

Comments
 (0)