更新帖子:
我想知道为什么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'].dtype
与x['new2'].dtype
不匹配,前者为dtype('<M8[ns]')
,后者为 dtype('float64')
。
我用这条线修好了,但我想知道为什么会发生这种情况,因为这对我来说没什么意义。
x['new2'] = pd.to_datetime(x[['startDate2','stopDate2']].min(1))
有很多行,所以我无法完成所有这些行。 这对startDate2
和stopDate2
列有什么意义?
更新为原始帖子
我在列之间找到的唯一区别是stopDate2
至少有一行NaT
。删除NaT
可以解决问题,但我无法使用虚拟数据重现它。
答案 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