【问题标题】:Conversion to_datetime error, unrecognized value type转换为_datetime 错误,无法识别的值类型
【发布时间】:2019-06-01 08:48:07
【问题描述】:

我有一个 flight.csv 数据库,其中包含在特定机场起飞和降落的航班以及与每个飞行步骤相关的时间,即起飞、离地轮子、地上轮子、到达、实际到达和离开等。

现在我想将数据库中给定的时间转换为 24 小时格式的浮点数 例如:13:45 是 1345.0 00:02 是 0002.0

其中两列(Scheduled_departure 和 Scheduledarrival)是整数,所以我很容易通过以下方式将它们转换为时间:

flights['SCHEDULED_DEPARTURE'] = flights['SCHEDULED_DEPARTURE'].apply(lambda x: '{0:0>4}'.format(x))

(在时间数字前加零)

flights['SCHEDULED_DEPARTURE'] = pd.to_datetime(flights['SCHEDULED_DEPARTURE'],format= '%H%M').dt.time

(用于实际转换`

但由于其他列是浮点数,我不能直接使用 astype() 因为它会为小数创建错误。

所以我试图绕过我的方式:

pd.to_numeric(flights.DEPARTURE_TIME, downcast = 'integer')

(去掉小数)

flights.DEPARTURE_TIME = flights.DEPARTURE_TIME.astype(dtype='int32')

(为了下一步的冗余)

flights['DEPARTURE_TIME'] = flights['DEPARTURE_TIME'].apply(lambda x: '{0:0>4}'.format(x))

(在数字前添加零)

flights['DEPARTURE_TIME'] = pd.to_datetime(flights['DEPARTURE_TIME'],format= '%H%M').dt.time

(用于实际时间转换)

但是经过这一步,却输出错误:

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    ~\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py in _convert_listlike_datetimes(arg, box, format, name, tz, unit, errors, infer_datetime_format, dayfirst, yearfirst, exact)
        290             try:
    --> 291                 values, tz = conversion.datetime_to_datetime64(arg)
        292                 return DatetimeIndex._simple_new(values, name=name, tz=tz)

    pandas/_libs/tslibs/conversion.pyx in 
    pandas._libs.tslibs.conversion.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-23-a3defb9ecd52> in <module>
    ----> 1 flights['DEPARTURE_TIME'] = 
    pd.to_datetime(flights['DEPARTURE_TIME'],format= '%H%M').dt.time

    ~\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py in 
    to_datetime(arg, errors, dayfirst, yearfirst, utc, box, format, exact, 
    unit, infer_datetime_format, origin, cache)
     590         else:
     591             from pandas import Series
 --> 592             values = convert_listlike(arg._values, True, format)
     593             result = Series(values, index=arg.index, name=arg.name)
     594     elif isinstance(arg, (ABCDataFrame, compat.MutableMapping)):

    ~\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py in 
    _convert_listlike_datetimes(arg, box, format, name, tz, unit, errors, 
    infer_datetime_format, dayfirst, yearfirst, exact)
         292                 return DatetimeIndex._simple_new(values, name=name, tz=tz)
         293             except (ValueError, TypeError):
     --> 294                 raise e
         295 
         296     if result is None:

    ~\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py in 
    _convert_listlike_datetimes(arg, box, format, name, tz, unit, errors, 
    infer_datetime_format, dayfirst, yearfirst, exact)
        259                 try:
        260                     result, timezones = array_strptime(
    --> 261                         arg, format, exact=exact, errors=errors)
        262                     if '%Z' in format or '%z' in format:
        263                         return _return_parsed_timezone_results(

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

     ValueError: unconverted data remains: 0

帮我把那些浮点数转换成时间。

我无法直接转换整数,因为日期时间需要正确的格式,包括零。

DEPARTURE_TIME 的预期版本如下所示:

0 08:00:00 1 08:30:00 2 19:10:00 3 15:15:00 4 14:27:00 Name: SCHEDULED_DEPARTURE, dtype: object

【问题讨论】:

  • 能否在转换为时间之前显示SCHEDULED_DEPARTURE 行示例?

标签: python pandas datetime jupyter


【解决方案1】:

我使用了以下字符串,而不是“真正的”输入文件:

data="""xx,DEPARTURE_TIME
f1,0800.0
f2,0830.0
f3,1910.0
f4,1515.0
f5,1427.0"""

所以输入仅限于 DEPARTURE_TIMExx 代表其他列。

作为我定义的转换函数:

def cnv(src):
    return f'{src[0:2]}:{src[2:4]}:00'

它将用于转换DEPARTURE_TIME列。

src 参数是一个 string - 输入行的一部分,涉及 相应的列。返回值为:前 2 个字符,后 2 个字符 和 00,在它们之间有 :

并读取我使用的源 CSV:

df = pd.read_csv(pd.compat.StringIO(data),\
    converters={'DEPARTURE_TIME': cnv})

在您的程序中,从您的输入文件中读取(而不是 StringIO)。

目前 DEPARTURE_TIME 列属于 字符串 类型。

但如果出于任何原因您希望将此列设为时间, 你可以再做一次转换:

df.DEPARTURE_TIME = pd.to_datetime(
    df.DEPARTURE_TIME, format= '%H:%M:%S' ).dt.time

当你print(df)时,在上述指令之前和之后 你会得到相同的输出:

   xx DEPARTURE_TIME
0  f1       08:00:00
1  f2       08:30:00
2  f3       19:10:00
3  f4       15:15:00
4  f5       14:27:00

但是如果你运行type(df.iloc[0,1]),你会看到转换后的类型 是 datetime.time(之前是 str)。

另一方面,如果你运行df.info(),你会在之前和之后看到 DEPARTURE_TIME 列的最后一次转换类型是 object

您可以对格式化为 floats 的其他输入列使用相同的方法。

【讨论】:

  • 天哪,你一个人救了我的实习项目,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2016-12-20
相关资源
最近更新 更多