【问题标题】:Strange behavior of datetimes when loaded into pd.DataFrame加载到 pd.DataFrame 时日期时间的奇怪行为
【发布时间】:2019-11-30 10:04:08
【问题描述】:

我正在尝试构建简单的 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

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

【问题讨论】:

  • 尝试: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] ,答案是 Timestamp('2018-01-10 00:00:00') 。这就是您无法合并的原因。
  • 谢谢。这样可行。我仍然想知道加载数据时发生了什么:-)

标签: python pandas numpy datetime


【解决方案1】:

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

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,代码保持原样。

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

【讨论】:

    【解决方案2】:

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

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

    这似乎更符合您的要求。

    【讨论】:

      猜你喜欢
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2015-05-11
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多