Python 加载到pd.DataFrame时datetimes的奇怪行为

Python 加载到pd.DataFrame时datetimes的奇怪行为,python,pandas,numpy,datetime,Python,Pandas,Numpy,Datetime,我试图构造简单的数据帧。两者都有一个日期,而第一个有一个附加列: import pandas as pd import datetime as dt import numpy as np a = pd.DataFrame(np.array([ [dt.datetime(2018, 1, 10), 5.0]]), columns=['date', 'amount']) print(a) # date_dt amount # 2018-01-10 00:00:00 5

我试图构造简单的数据帧。两者都有一个日期,而第一个有一个附加列:

import pandas as pd
import datetime as dt
import numpy as np

a = pd.DataFrame(np.array([
        [dt.datetime(2018, 1, 10), 5.0]]), columns=['date', 'amount'])

print(a)

# date_dt   amount
# 2018-01-10 00:00:00   5

b = pd.DataFrame(np.array([
        [dt.datetime(2018, 1, 10)]]), columns=['date'])

print(b)

# date_dt
# 2018-01-10

为什么日期的解释不同(有时间和没有时间)?当我以后尝试应用合并时,它会给我带来问题。

a中的两列都是对象,因为numpy数组是一个中间数组(类型为
object
)。我认为不隐式解释混合对象可能是一种好的行为

a = pd.DataFrame([[dt.datetime(2018, 1, 10), 5.0]], columns=['date', 'amount'])

这似乎更符合您的需求。

好的,下面是发生的情况。我将使用以下代码:

import pandas as pd
import datetime as dt
import numpy as np

a_val = np.array([[dt.datetime(2018, 1, 10), 5.0]])

a = pd.DataFrame(a_val, columns=['date', 'amount'])

b_val = np.array([[dt.datetime(2018, 1, 10)]])
b = pd.DataFrame(b_val, columns=['date'])
我只是分割pd数据帧的内容并调用数据帧本身。首先,让我们打印thr
a_val
b_val
变量:

print(a_val, b_val)
# output: [[datetime.datetime(2018, 1, 10, 0, 0) 5.0]] [[datetime.datetime(2018, 1, 10, 0, 0)]]
所以仍然很好,对象是datetime.datetime

现在,让我们使用
访问数据帧的值。值

print(a.values, b.values)
# output: [[datetime.datetime(2018, 1, 10, 0, 0) 5.0]] [['2018-01-10T00:00:00.000000000']]
这里乱七八糟。让我们打印日期的类型:

print(type(a.values[0][0]), type(b.values[0][0]))
# output: <class 'datetime.datetime'> <class 'numpy.datetime64'>
打印(类型(a.values[0][0]),类型(b.values[0][0]))
#输出:
好的,就是这样:因为在第二个数据帧中,您只有一个日期对象,并且您调用
np.array()
,所以日期被强制转换为一个
numpy.datetime64
对象,该对象具有不同的格式。相反,在第一个数据帧中,您有一个datetime对象加上一个int,代码保持原样


短版本:如果您有一个不同对象的集合,如日期、字符串、int等。请使用列表,而不是numpy数组

尝试:
a['date']=pd.to_datetime(a['date'])
,这将允许您合并。就连我都在等你的问题的答案。当我运行
a['date']=pd.to_datetime(a['date'])
时,结果是:
datetime.datetime(2018,1,10,0,0)
对于
b.date.iloc[0]
,答案是
时间戳('2018-01-10 00:00:00')
。这就是您无法合并的原因。谢谢。这很有效。我仍然想知道加载数据时发生了什么:-)