属性错误:: datetime.date obect没有属性“ split”

时间:2018-10-13 11:31:56

标签: python pandas date datetime series

如何避免在尝试拆分datetime时出现错误?我正在尝试将datetime分成年份,月份和日期部分。

# Split the  date (This converts each observation into a list)
previous_loans['firstduedate'] = previous_loans['firstduedate'].apply(lambda x: x.split('-'))

# Convert all elements in each observation(list) from str to int
previous_loans['firstduedate'] = previous_loans['firstduedate'].apply(lambda x: [int(y) for y in x ])

# Convert each observation into a date format
previous_loans['firstduedate'] = previous_loans['firstduedate'].apply(lambda x : date(x[0], x[1], x[2]), datetime=True)

我得到的错误是

Attribute error ::datetime.date obect has no attribute 'split'

1 个答案:

答案 0 :(得分:0)

您要实现的目标至少有三个问题:

  1. 请勿在熊猫系列中使用datetime.date个对象。使用对熊猫友好的pd.Timestamp通过pd.to_datetime创建datetime系列。这使您可以利用NumPy数组和高效的矢量化操作。
  2. 日期对象,无论是datetime.date还是pd.Timestamp,都是通过整数而不是字符串在内部存储的。因此,请勿尝试通过str.split“拆分”它们。
  3. str.split返回一个列表。这是反熊猫,因为这意味着您要存储两层指针,即一系列本身包含指针的列表。而是构造int列来代表日期的组成部分。

这是一种方法:

from datetime import date

df = pd.DataFrame({'date': [date(2018, 1, 1), date(2018, 5, 20), date(2018, 9, 11)]})

df['date'] = pd.to_datetime(df['date'])

L = ['year', 'month', 'day']
df = df.join(pd.concat([getattr(df['date'].dt, i).rename(i) for i in L], axis=1))

print(df)

        date  year  month  day
0 2018-01-01  2018      1    1
1 2018-05-20  2018      5   20
2 2018-09-11  2018      9   11

可以使代码与datetime.date对象一起工作,但是首先需要进行字符串转换,并留下一系列列表。既不推荐方法也不推荐结果:

# AttributeError: 'datetime.date' object has no attribute 'split'
# df['date_split'] = df['date'].apply(lambda x: x.split('-'))  
df['date_split'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d').split('-'))

print(df)

         date      date_split
0  2018-01-01  [2018, 01, 01]
1  2018-05-20  [2018, 05, 20]
2  2018-09-11  [2018, 09, 11]