【发布时间】:2015-11-15 05:19:51
【问题描述】:
我查看了其他几个相关的问题here、here 和here,但没有一个和我遇到过完全相同的问题。
我使用的是 Pandas 0.16.2 版。我在 Pandas 数据框中有几列,数据类型为 datetime64[ns]:
In [6]: date_list = ["SubmittedDate","PolicyStartDate", "PaidUpDate", "MaturityDate", "DraftDate", "CurrentValuationDate", "DOB", "InForceDate"]
In [11]: data[date_list].head()
Out[11]:
SubmittedDate PolicyStartDate PaidUpDate MaturityDate DraftDate \
0 NaT 2002-11-18 NaT 2041-03-04 NaT
1 NaT 2015-01-13 NaT NaT NaT
2 NaT 2014-10-15 NaT NaT NaT
3 NaT 2009-08-27 NaT NaT NaT
4 NaT 2007-04-19 NaT 2013-10-01 NaT
CurrentValuationDate DOB InForceDate
0 2015-04-30 1976-03-04 2002-11-18
1 NaT 1949-09-27 2015-01-13
2 NaT 1947-06-15 2014-10-15
3 2015-07-30 1960-06-07 2009-08-27
4 2010-04-21 1950-10-01 2007-04-19
这些最初是字符串格式(例如“1976-03-04”),我使用以下方法将其转换为日期时间对象:
In [7]: for datecol in date_list:
...: data[datecol] = pd.to_datetime(data[datecol], coerce=True, errors = 'raise')
以下是每一列的数据类型:
In [8]: for datecol in date_list:
print data[datecol].dtypes
返回:
datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]
到目前为止,一切都很好。但我想要做的是为这些列中的每一个创建一个新列,给出从某个日期开始的天数(作为整数)。
In [13]: current_date = pd.to_datetime("2015-07-31")
我第一次运行这个:
In [14]: for i in date_list:
....: data[i+"InDays"] = data[i].apply(lambda x: current_date - x)
但是,当我检查返回列的 dtype 时:
In [15]: for datecol in date_list:
....: print data[datecol + "InDays"].dtypes
我得到了这些:
object
timedelta64[ns]
object
timedelta64[ns]
object
timedelta64[ns]
timedelta64[ns]
timedelta64[ns]
我不知道为什么其中三个是对象,什么时候应该是时间增量。我接下来要做的是:
In [16]: for i in date_list:
....: data[i+"InDays"] = data[i+"InDays"].dt.days
这种方法适用于 timedelta 列。但是,由于其中三列不是 timedeltas,我收到此错误:
AttributeError: Can only use .dt accessor with datetimelike values
我怀疑这三列中的某些值会阻止 Pandas 将它们转换为 timedeltas。我不知道如何计算出这些值可能是什么。
【问题讨论】:
标签: python datetime numpy pandas timedelta