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数据帧的内容并调用数据帧本身。首先,让我们打印thra_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')
。这就是您无法合并的原因。谢谢。这很有效。我仍然想知道加载数据时发生了什么:-)