Pandas中的'astype'与日期(或日期时间)

10

这个答案提供了一种非常优雅的方法,可以在一行中设置pandas列的所有类型:

# convert column "a" to int64 dtype and "b" to complex type
df = df.astype({"a": int, "b": complex})

我开始认为这种方法的应用有限,你将不得不在许多行中尽快使用各种其他列类型转换的方法。我测试了 'category',它可以正常工作,因此它会接受实际的 Python 类型,如intcomplex,然后是带引号的 Pandas 术语,如'category'

我有一列日期,看起来像这样:

25.07.10
08.08.10
07.01.11

我看了一下关于将日期列强制转换的这个答案,但是它们中没有一个似乎适合上面优雅的语法。
我尝试过:
from datetime import date
df = df.astype({"date": date})

但是它报错了:

TypeError: dtype '<class 'datetime.date'>' not understood

我也尝试过pd.Series.dt.date,但它也没有起作用。是否有可能像这样在一行中转换包括日期或日期时间列在内的所有列?


1
你是如何获取这个数据框 df 的?如果是通过 CSV 读取的话,你可以简单地使用 dtypes 参数来显式设置每一列的 dtype - tidakdiinginkan
是的,我正在从csv文件中读取它。也许这就是你应该做的事情,当你读取它时将一些东西放入read_csv中,但仍然有人认为在一行之后仍然是可能的。 - cardamom
1
我认为在 Pandas 中没有 date dtype, 但是你可以使用以下相同的语法将其转换为 datetime - df = df.astype({'date': 'datetime64[ns]'})。 当你使用 pd.to_datetime(df['date']).dt.date 将一个 object 转换为 date 时,其 dtype 仍为 object - tidakdiinginkan
2
df = df.astype({'date': 'datetime64[ns]'}) 运行良好。我认为它必须具有对不同日期格式、年份先后、两位数或四位数年份等方面的相当大的内置能力。我只是看到了 64 ns,以为它要求时间单位为纳秒。虽然可能存在“date”类型,但从文档中我得出的印象是该类型完全适用于日期。https://numpy.org/doc/1.18/reference/arrays.datetime.html - cardamom
2个回答

26

在评论中已经回答过了,指出以下内容可行:

df.astype({'date': 'datetime64[ns]'})

此外,您可以在读取数据时设置dtype:

pd.read_csv('path/to/file.csv', parse_dates=['date'])

2
Pandas的datetime数据类型来自于numpy的datetime64,因此您也可以使用以下内容;虽然没有“date”数据类型(尽管您可以对包含datetime.date值的列执行矢量化操作)。
df = df.astype({'date': np.datetime64})

# or (on a little endian system)
df = df.astype({'date': '<M8'})
# (on a big endian system)
df = df.astype({'date': '>M8'})

话虽如此,由于无法将日期时间格式传递给astype(),这有点原始,最好使用pd.to_datetime()代替。例如,如果数据中的日期格式为%d/%m/%Y,例如01/04/2020astype()会错误地解析它为Jan 1, 2020,而使用pd.to_datetime(),您可以传递正确的格式。

即使使用read_csv,您也可以对格式进行一些控制,例如:

df = pd.read_csv('file.csv', parse_dates=['date'], dayfirst=True)

看起来你打错字了。我认为这应该是说"astype()会错误地解析为2020年1月4日"。 - undefined
@HeidiRodenhizer 感谢你指出错别字。我已经编辑了答案,修复了错别字,并进行了一些与版本相关的其他更新。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接