Skip to content

Commit e79c28d

Browse files
committed
BUG: consistent datetime display format with < ms pandas-dev#10170
1 parent b43013a commit e79c28d

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

pandas/tests/test_format.py

+30-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from numpy.random import randn
1515
import numpy as np
1616

17-
from pandas import DataFrame, Series, Index, Timestamp, MultiIndex
17+
from pandas import DataFrame, Series, Index, Timestamp, MultiIndex, date_range, NaT
1818

1919
import pandas.core.format as fmt
2020
import pandas.util.testing as tm
@@ -2495,7 +2495,7 @@ def test_to_string(self):
24952495

24962496
def test_freq_name_separation(self):
24972497
s = Series(np.random.randn(10),
2498-
index=pd.date_range('1/1/2000', periods=10), name=0)
2498+
index=date_range('1/1/2000', periods=10), name=0)
24992499

25002500
result = repr(s)
25012501
self.assertTrue('Freq: D, Name: 0' in result)
@@ -2556,7 +2556,6 @@ def test_float_trim_zeros(self):
25562556

25572557
def test_datetimeindex(self):
25582558

2559-
from pandas import date_range, NaT
25602559
index = date_range('20130102',periods=6)
25612560
s = Series(1,index=index)
25622561
result = s.to_string()
@@ -2574,7 +2573,6 @@ def test_datetimeindex(self):
25742573

25752574
def test_timedelta64(self):
25762575

2577-
from pandas import date_range
25782576
from datetime import datetime, timedelta
25792577

25802578
Series(np.array([1100, 20], dtype='timedelta64[ns]')).to_string()
@@ -3179,6 +3177,34 @@ def test_date_nanos(self):
31793177
result = fmt.Datetime64Formatter(x).get_result()
31803178
self.assertEqual(result[0].strip(), "1970-01-01 00:00:00.000000200")
31813179

3180+
def test_dates_display(self):
3181+
3182+
# 10170
3183+
# make sure that we are consistently display date formatting
3184+
x = Series(date_range('20130101 09:00:00',periods=5,freq='D'))
3185+
result = fmt.Datetime64Formatter(x).get_result()
3186+
self.assertEqual(result[0].strip(), "2013-01-01 09:00:00")
3187+
self.assertEqual(result[4].strip(), "2013-01-05 09:00:00")
3188+
3189+
x = Series(date_range('20130101 09:00:00',periods=5,freq='s'))
3190+
result = fmt.Datetime64Formatter(x).get_result()
3191+
self.assertEqual(result[0].strip(), "2013-01-01 09:00:00")
3192+
self.assertEqual(result[4].strip(), "2013-01-01 09:00:04")
3193+
3194+
x = Series(date_range('20130101 09:00:00',periods=5,freq='ms'))
3195+
result = fmt.Datetime64Formatter(x).get_result()
3196+
self.assertEqual(result[0].strip(), "2013-01-01 09:00:00.000000")
3197+
self.assertEqual(result[4].strip(), "2013-01-01 09:00:00.004000")
3198+
3199+
x = Series(date_range('20130101 09:00:00',periods=5,freq='us'))
3200+
result = fmt.Datetime64Formatter(x).get_result()
3201+
self.assertEqual(result[0].strip(), "2013-01-01 09:00:00.000000")
3202+
self.assertEqual(result[4].strip(), "2013-01-01 09:00:00.000004")
3203+
3204+
x = Series(date_range('20130101 09:00:00',periods=5,freq='N'))
3205+
result = fmt.Datetime64Formatter(x).get_result()
3206+
self.assertEqual(result[0].strip(), "2013-01-01 09:00:00.000000000")
3207+
self.assertEqual(result[4].strip(), "2013-01-01 09:00:00.000000004")
31823208

31833209
class TestNaTFormatting(tm.TestCase):
31843210
def test_repr(self):

pandas/tslib.pyx

+14-6
Original file line numberDiff line numberDiff line change
@@ -1418,13 +1418,22 @@ def format_array_from_datetime(ndarray[int64_t] values, object tz=None, object f
14181418
"""
14191419
cdef:
14201420
int64_t val, ns, N = len(values)
1421+
ndarray[int64_t] consider_values
1422+
bint show_us = 0, show_ns = 0
14211423
ndarray[object] result = np.empty(N, dtype=object)
14221424
object ts, res
14231425
pandas_datetimestruct dts
14241426

14251427
if na_rep is None:
14261428
na_rep = 'NaT'
14271429

1430+
# if we have not formatting & tz, then choose
1431+
# a format based on precision
1432+
if format is None and tz is None:
1433+
consider_values = values[values != iNaT]
1434+
show_us = ((consider_values/1000)%1000).any() or ((consider_values/(1000*1000))%1000).any()
1435+
show_ns = (consider_values%1000).any()
1436+
14281437
for i in range(N):
14291438
val = values[i]
14301439

@@ -1441,12 +1450,11 @@ def format_array_from_datetime(ndarray[int64_t] values, object tz=None, object f
14411450
dts.min,
14421451
dts.sec)
14431452

1444-
ns = dts.ps / 1000
1445-
1446-
if ns != 0:
1447-
res += '.%.9d' % (ns + 1000 * dts.us)
1448-
elif dts.us != 0:
1449-
res += '.%.6d' % dts.us
1453+
if show_ns:
1454+
ns = dts.ps / 1000
1455+
res += '.%.9d' % (ns + 1000 * dts.us)
1456+
elif show_us:
1457+
res += '.%.6d' % dts.us
14501458

14511459
result[i] = res
14521460

0 commit comments

Comments
 (0)