为什么Pandas将日期时间转换为在聚合函数中浮动

时间:2016-04-14 10:22:09

标签: python numpy pandas

更新帖子:

我想知道为什么Pandas正在将datetime列转换为float列。

下面的代码再现了我遇到的问题。

df = pd.DataFrame(pd.date_range("2012-01-01", periods=12).values.reshape(3,4), columns=list('abcd'))

print "Original:", {col: df[col].dtype for col in df.columns}

df['c'].loc[1] = pd.NaT
df['d'].loc[1] = pd.NaT

df['ab'] = df[['a','b']].min(1)
df['cd'] = df[['c','d']].min(1)

print "New:", {col: df[col].dtype for col in df.columns}

打印:

Original: {'a': dtype('<M8[ns]'), 'c': dtype('<M8[ns]'), 'b': dtype('<M8[ns]'), 'd': dtype('<M8[ns]')}
New: {'a': dtype('<M8[ns]'), 'c': dtype('<M8[ns]'), 'b': dtype('<M8[ns]'), 'd': dtype('<M8[ns]'), 'cd': dtype('float64'), 'ab': dtype('<M8[ns]')}

请注意,列ab的类型为dtype('<M8[ns]'),但cd的类型为dtype('float64')

为什么熊猫会改变类型?

原帖:

我正在运行非常简单的代码:

x['new1'] = x[['startDate1','stopDate1']].min(1)
x['new2'] = x[['startDate2','stopDate2']].min(1)

其中x看起来像这样:

ID         startDate1    stopDate1    startDate2    stopDate2

0          2000-01-01   2000-03-05    2005-01-01   2006-03-05
               ...          ...          ...          ...
40053      1997-01-01   2011-03-05    2012-01-01   2012-03-05

在所有原始列上运行x[colName].dtype会返回dtype('<M8[ns]')

但是,x['new1'].dtypex['new2'].dtype不匹配,前者为dtype('<M8[ns]'),后者为 dtype('float64')

我用这条线修好了,但我想知道为什么会发生这种情况,因为这对我来说没什么意义。

x['new2'] = pd.to_datetime(x[['startDate2','stopDate2']].min(1))

有很多行,所以我无法完成所有这些行。 这对startDate2stopDate2列有什么意义?

更新为原始帖子 我在列之间找到的唯一区别是stopDate2至少有一行NaT。删除NaT可以解决问题,但我无法使用虚拟数据重现它。

2 个答案:

答案 0 :(得分:0)

如评论中所述,由于存在NaN,可能存在错误,如果您想要解决问题,可以这样做:

df[["c", "d"]].min(axis=1).astype("<M8[ns]")

答案 1 :(得分:0)

相关问题。使用pandas 0.18.1。请注意df.timestamp在两种不同的场景中有不同的类型:

df = pd.DataFrame(np.random.rand(250).reshape(50,5), 
                      index=pd.date_range('1/1/2016', periods=50, freq='H' ),
                      columns=list('ABCDE'))
df['timestamp'] = df.index

print(df.timestamp.resample('30min',label='right').last().head(3))
print('==========')
print(df.timestamp.resample('2H',label='right').last().head(3))

输出:

2016-01-01 00:30:00    1.451606e+18
2016-01-01 01:00:00             NaN
2016-01-01 01:30:00    1.451610e+18
Freq: 30T, Name: timestamp, dtype: float64
==========
2016-01-01 02:00:00   2016-01-01 01:00:00
2016-01-01 04:00:00   2016-01-01 03:00:00
2016-01-01 06:00:00   2016-01-01 05:00:00
Freq: 2H, Name: timestamp, dtype: datetime64[ns]

还发现了与此问题相关的错误报告: https://github.com/pydata/pandas/issues/12941