Python Pandas 系列失败日期时间

Posted

技术标签:

【中文标题】Python Pandas 系列失败日期时间【英文标题】:Python Pandas Series failure datetime 【发布时间】:2017-04-04 14:57:29 【问题描述】:

我认为这一定是熊猫的失败,有熊猫系列(v.18.1 和 19 也是),如果我为系列分配日期,第一次添加为 int(错误),第二次添加为日期时间(正确),我无法理解原因。

例如使用此代码:

import datetime as dt
import pandas as pd
series = pd.Series(list('abc'))
date = dt.datetime(2016, 10, 30, 0, 0)
series["Date_column"] =date
print("The date is  and the type is ".format(series["Date_column"], type(series["Date_column"])))
series["Date_column"] =date
print("The date is  and the type is ".format(series["Date_column"], type(series["Date_column"])))

输出是:

The date is 1477785600000000000 and the type is <class 'int'>
The date is 2016-10-30 00:00:00 and the type is <class 'datetime.datetime'>

如您所见,第一次它总是将值设置为 int 而不是 datetime。

有人可以帮助我吗? 非常感谢您, 哈维。

【问题讨论】:

我不知道是什么导致了这种行为,但是在将日期添加到字符串列时应该小心。您知道您添加的是一行,而不是一列,对吧? 这对我来说闻起来像一个错误,Series 支持混合 dtype,因此看起来日期时间在初始分配时被强制为 int,但随后覆盖相同的索引标签位置会产生预期的行为。我会在github 上发布问题 【参考方案1】:

原因是系列是“对象”类型,而 pandas DataFrame(或系列)的列是同质类型的。您可以使用 dtype(或 DataFrame.dtypes)进行检查:

series = pd.Series(list('abc'))
series
Out[3]:
0    a
1    b
2    c
dtype: object

In [15]: date = dt.datetime(2016, 10, 30, 0, 0)
date
Out[15]: datetime.datetime(2016, 10, 30, 0, 0)

In [18]: print(date)
2016-10-30 00:00:00

In [17]: type(date)
Out[17]: datetime.datetime

In [19]: series["Date_column"] = date
In [20]: series

Out[20]:
0                                a
1                                b
2                                c
Date_column    1477785600000000000
dtype: object

In [22]: series.dtype

Out[22]: dtype('O')

只有通用的 'object' dtype 可以保存任何 python 对象(在您的情况下,将 datetime.datetime 对象插入到系列中)。

此外,Pandas Series 是基于 Numpy Arrays 的,它们不是混合类型,违背了使用 Pandas DataFrames 和 Series 或 Numpy 的计算优势的目的。

你能用 python list() 代替吗?还是 DataFrame()?

【讨论】:

以上是关于Python Pandas 系列失败日期时间的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas 索引排序/分组/日期时间

Python Pandas:当日期小于 13 时,pandas.to_datetime() 正在切换日期和月份

如何使用空值将字符串转换为日期时间 - python,pandas?

Python pandas整数YYYYMMDD到日期时间

当有两个索引、pandas、python 时针对日期时间进行绘图

可感知 tz 的日期时间序列在 pandas 系列应用(lambda)操作中产生基于 UTC 的 .date() 输出