将Dataset中的列类型转换为python中具有特定格式的日期时间类型时出错

Posted

技术标签:

【中文标题】将Dataset中的列类型转换为python中具有特定格式的日期时间类型时出错【英文标题】:Error in converting a column type in Dataset into datetime type with specific format in python 【发布时间】:2019-06-16 07:59:49 【问题描述】:

我有一个数据集,我想更改名为“上次更新”的列的格式。

 DB['Last Updated'].head()

 0     January 7, 2018
 1    January 15, 2018
 2      August 1, 2018
 3        June 8, 2018
 4       June 20, 2018
Name: Last Updated, dtype: object

我想制作像 2018 年 7 月 1 日这样的格式,所以我在 python 中编写了以下内容。

 DB['Last Updated'] = pd.to_datetime(DB['Last Updated'],format= '%d/%m/%Y')

但是出现了这个错误:

 TypeError                                 Traceback (most recent call last) ~/anaconda3/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
 302             try:
 --> 303                 values, tz = tslib.datetime_to_datetime64(arg)
304                 return DatetimeIndex._simple_new(values, name=name, tz=tz)

pandas/_libs/tslib.pyx in pandas._libs.tslib.datetime_to_datetime64()

TypeError: Unrecognized value type: <class 'str'>

 During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
 <ipython-input-62-1dd2ca5f727a> in <module>()
 ----> 1 DB['Last Updated'] = pd.to_datetime(DB['Last Updated'],format= '%d/%m/%Y')

~/anaconda3/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in to_datetime(arg, errors, dayfirst, yearfirst, utc, box, format, exact, unit, infer_datetime_format, origin)
371     elif isinstance(arg, ABCSeries):
372         from pandas import Series
--> 373         values = _convert_listlike(arg._values, True, format)
374         result = Series(values, index=arg.index, name=arg.name)
375     elif isinstance(arg, (ABCDataFrame, MutableMapping)):

~/anaconda3/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
304                 return DatetimeIndex._simple_new(values, name=name, tz=tz)
305             except (ValueError, TypeError):
--> 306                 raise e
307 
308     if arg is None:

~/anaconda3/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
271                     try:
272                         result = array_strptime(arg, format, exact=exact,
--> 273                                                 errors=errors)
274                     except tslib.OutOfBoundsDatetime:
275                         if errors == 'raise':

pandas/_libs/tslibs/strptime.pyx in pandas._libs.tslibs.strptime.array_strptime()

 ValueError: time data 'January 7, 2018' does not match format '%d/%m/%Y' (match)

我该如何处理这个错误?

【问题讨论】:

【参考方案1】:

pd.to_datetime(...) 中的 format 参数用于指定要转换的字符串的格式(而不是指定输出格式)。为了将您的日期字符串转换为日期时间对象,然后转换为特定的输出格式,您可以执行以下操作:

import pandas as pd

data = ['Last Updated': 'January 7, 2018', 'Last Updated': 'January 15, 2018']
df = pd.DataFrame(data)

df['Last Updated'] = pd.to_datetime(df['Last Updated'])
df['Last Updated'] = df['Last Updated'].dt.strftime('%d/%m/%Y')

print(df)
# OUTPUT
#   Last Updated
# 0   07/01/2018
# 1   15/01/2018 

【讨论】:

data_google['Last Updated']= pd.to_datetime(data_google['Last Updated']) ---> data_google['Last Updated']= data_google['Last Updated'].dt。 striftime('%d/%m/%Y') --> ValueError: day is out of range for month - -> 和 make ..--> data_google['Last Updated']= pd.to_datetime(data_google[ '最后更新'],dayfirst = True) --> data_google['最后更新']= data_google['最后更新'].dt.striftime('%d/%m/%Y') ,,--> i收到此错误 ValueError: month must be in 1..12 听起来您的列中可能有一些pd.to_datetime() 无法处理的日期字符串。如果您可以在您的专栏中分享其他一些不同日期字符串的示例,我们或许可以提供帮助。 我发现这个字段 2.3.16 >.. 有影响吗?? @AFB - 如果“上次更新”列值之一是“2.3.16”,那么 pd.to_datetime 应该可以处理得很好。但是,如果您的意思是“上次更新”列值之一是“2.3.16 >”,那么pd.to_datetime 将引发 ValueError。如果您的“上次更新”列值不是所有普通日期字符串(例如您在问题中发布的那些),那么您将需要编写自定义方法来重新格式化它们,而不是使用 pd.to_datetimedatetime.strftime 在此答案中概述的方式。 好的。我会尽力做到这一点..谢谢

以上是关于将Dataset中的列类型转换为python中具有特定格式的日期时间类型时出错的主要内容,如果未能解决你的问题,请参考以下文章

将具有混合复杂类型元素的 XML 转换为 DataSet,以及其他 DataSet 限制

在 Spark SQL 中将 long 类型的列转换为 calendarinterval 类型

Scala - 如何将 Dataset[Row] 转换为可添加到 Dataframe 的列

如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列

如何将具有数字值的 char 数据类型的列转换为数字数据类型

如何将具有 Decimal 的 spark DataFrame 转换为具有相同精度的 BigDecimal 的 Dataset?