Skip to content

Commit 4d9238c

Browse files
Chang Shewesm
Chang She
authored andcommitted
BUG: series/frame describe fails for datetime64 data
1 parent 65e7797 commit 4d9238c

File tree

5 files changed

+29
-3
lines changed

5 files changed

+29
-3
lines changed

pandas/core/frame.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3771,6 +3771,7 @@ def pretty_name(x):
37713771

37723772
for column in numdata.columns:
37733773
series = self[column]
3774+
ser_desc = series.describe()
37743775
destat.append([series.count(), series.mean(), series.std(),
37753776
series.min(), series.quantile(lb), series.median(),
37763777
series.quantile(ub), series.max()])
@@ -4059,7 +4060,8 @@ def _get_numeric_data(self):
40594060
num_data = self._data.get_numeric_data()
40604061
return DataFrame(num_data, copy=False)
40614062
else:
4062-
if self.values.dtype != np.object_:
4063+
if (self.values.dtype != np.object_ and
4064+
not issubclass(self.values.dtype.type, np.datetime64)):
40634065
return self
40644066
else:
40654067
return self.ix[:, []]

pandas/core/internals.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,8 @@ def is_consolidated(self):
523523

524524
def get_numeric_data(self, copy=False):
525525
num_blocks = [b for b in self.blocks
526-
if isinstance(b, (IntBlock, FloatBlock, ComplexBlock))]
526+
if (isinstance(b, (IntBlock, FloatBlock, ComplexBlock))
527+
and not isinstance(b, DatetimeBlock))]
527528

528529
indexer = np.sort(np.concatenate([b.ref_locs for b in num_blocks]))
529530
new_items = self.items.take(indexer)

pandas/core/series.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1310,12 +1310,21 @@ def describe(self, percentile_width=50):
13101310
top, freq = objcounts.most_common(1)[0]
13111311
data = [self.count(), len(objcounts), top, freq]
13121312

1313+
elif issubclass(self.dtype.type, np.datetime64):
1314+
names = ['count', 'unique', 'first', 'last', 'top', 'freq']
1315+
1316+
asint = self.dropna().view('i8')
1317+
objcounts = Counter(asint)
1318+
top, freq = objcounts.most_common(1)[0]
1319+
data = [self.count(), len(objcounts),
1320+
lib.Timestamp(asint.min()),
1321+
lib.Timestamp(asint.max()),
1322+
lib.Timestamp(top), freq]
13131323
else:
13141324

13151325
lb = .5 * (1. - percentile_width/100.)
13161326
ub = 1. - lb
13171327

1318-
13191328
def pretty_name(x):
13201329
x *= 100
13211330
if x == int(x):

pandas/tests/test_frame.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5248,6 +5248,10 @@ def test_describe_no_numeric(self):
52485248
columns=df.columns)
52495249
assert_frame_equal(desc, expected)
52505250

5251+
df = DataFrame({'time' : self.tsframe.index})
5252+
desc = df.describe()
5253+
assert(desc.time['first'] == min(self.tsframe.index))
5254+
52515255
def test_get_axis_etc(self):
52525256
f = self.frame
52535257

pandas/tests/test_series.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,6 +1111,16 @@ def test_describe_objects(self):
11111111
'top' : 'a', 'freq' : 3}, index=result.index)
11121112
assert_series_equal(result, expected)
11131113

1114+
ser = Series(self.ts.index)
1115+
rs = ser.describe()
1116+
min_date = min(self.ts.index)
1117+
max_date = max(self.ts.index)
1118+
xp = Series({'count' : len(self.ts.index),
1119+
'unique' : len(self.ts.index),
1120+
'first' : min_date, 'last' : max_date, 'freq' : 1,
1121+
'top' : min_date}, index=rs.index)
1122+
assert_series_equal(rs, xp)
1123+
11141124
def test_append(self):
11151125
appendedSeries = self.series.append(self.objSeries)
11161126
for idx, value in appendedSeries.iteritems():

0 commit comments

Comments
 (0)