Pandas数据帧列是否可能有日期时间.日期类型?

2024-04-26 02:28:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用cx_oracle从数据库中获取日期。我想将获取的数据放入pandas数据框中。我的问题是日期被转换成我绝对不需要的numpy.datetime64对象。在

我想要他们日期时间.日期物体。我见过dt.date方法,但它仍然返回numpy日期类型。在


Tags: 数据对象方法numpy数据库类型pandasdate
1条回答
网友
1楼 · 发布于 2024-04-26 02:28:41

编辑:在pandas 0.21.0或更高版本中,在数据帧中保存pythondatetime.dates是没有问题的。date-like列不会自动转换为datetime64[ns]数据类型。在

import numpy as np
import pandas as pd
import datetime as DT

print(pd.__version__)
# 0.21.0.dev+25.g50e95e0
dates = [DT.date(2017,1,1)+DT.timedelta(days=2*i) for i in range(3)]
df = pd.DataFrame({'dates': dates, 'foo': np.arange(len(dates))})
print(all([isinstance(item, DT.date) for item in df['dates']]))
# True
df['dates'] = (df['dates'] + pd.Timedelta(days=1))
print(all([isinstance(item, DT.date) for item in df['dates']]))
# True

对于旧版熊猫:

有一种方法可以防止Pandas数据帧自动转换 通过为datetime64[ns]分配一个附加值,如 空字符串,它与列的datelike不同。在数据帧之后 格式,可以删除非日期类型的值:

^{pr2}$

显然,将这种恶作剧编程成严肃的代码感觉是完全错误的,因为我们颠覆了开发人员的意图。 与datetime64[ns]的列表或对象数组相比,使用datetime64[ns]还有计算速度上的优势。 此外,如果df[col]具有数据类型datetime64[ns],则df[col].dt.date.values返回pythondatetime.dates的对象numy数组:

import pandas as pd
import datetime as DT
dates = [DT.datetime(2017,1,1)+DT.timedelta(days=2*i) for i in range(3)]
df = pd.DataFrame({'dates': dates})
print(repr(df['dates'].dt.date.values))
# array([datetime.date(2017, 1, 1), datetime.date(2017, 1, 3),
#        datetime.date(2017, 1, 5)], dtype=object)

因此,您可以通过将列保留为datetime64[ns]并在必要时使用df[col].dt.date.values来获得{}s,从而享受这两个世界的最佳效果。在

另一方面,datetime64[ns]和Python datetime.date具有不同的可表示日期范围。在

  • datetime64[ns]s可以表示来自{a1}的日期时间。在
  • datetime.dates可以表示从DT.date(0,1,1)到{}的日期。在

如果使用datetime.dates而不是{}s的原因是为了克服可表示日期的有限范围,那么a better alternative is to use a ^{}

import pandas as pd
import datetime as DT
dates = [DT.date(2017,1,1)+DT.timedelta(days=2*i) for i in range(10)]
df = pd.DataFrame({'dates':pd.PeriodIndex(dates, freq='D')})
print(df)
#        dates
# 0 2017-01-01
# 1 2017-01-03
# 2 2017-01-05
# 3 2017-01-07
# 4 2017-01-09
# 5 2017-01-11
# 6 2017-01-13
# 7 2017-01-15
# 8 2017-01-17
# 9 2017-01-19

相关问题 更多 >