python - 加载到 pd.DataFrame 时日期时间的奇怪行为

标签 python pandas numpy datetime

我正在尝试构建简单的 DataFrame。两者都有日期,而第一个有一个额外的列:

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

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

最佳答案

好的,这就是发生的事情。我将使用以下代码:

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 数据帧的内容并调用数据帧本身。首先让我们打印 a_valb_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。

现在让我们使用 .values 访问数据框的值:

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'>

好的,就是这样:因为在第二个数据帧中你只有一个日期对象,并且你调用了 np.array(),所以日期被转换为 numpy.datetime64 对象,它具有不同的格式。相反,在第一个数据框中,您有一个 datetime 对象和一个 int,代码将它们保持原样。

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

关于python - 加载到 pd.DataFrame 时日期时间的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57145851/

相关文章:

python - 如何使用 python db-api 安全地生成 SQL LIKE 语句

python - 如何直接在Dialogflow上获取文本响应?

pandas - 如何使用 df.rolling(window, min_periods, win_type ='exponential' ).sum()

python - 绘制 3D numpy 数组的第三轴

python - 计算一个数组的元素在另一个数组中的出现次数

python - tkinter 标签在一段时间后消失

python - Pandas:将多个变量转换为一组虚拟变量

python - win32com 错误 - 内部错误 - 缓冲区长度不是使用 dataframe.torecords() 遇到的序列长度

python - 返回数组中子数组的索引

python - Kivy 无法更新操作按钮图标