转换为_datetime错误,无法识别的值类型

时间:2019-06-01 08:48:07

标签: python pandas datetime jupyter

我有一个flight.csv数据库,该数据库包含在特定机场起飞和降落的航班以及与每个飞行步骤相关的时间,例如,起飞,离地转轮,地面转轮,到达,实际到达和起飞等。

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

其中两列(Scheduled_departure和“计划到达”)是整数,因此我很容易通过以下方式将它们转换为时间:

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

1 个答案:

答案 0 :(得分:0)

我使用以下字符串代替“ true”输入文件:

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

因此输入限制为表示其他列的 DEPARTURE_TIME xx

作为我定义的转换函数:

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 列为 string 类型。

但是,如果出于任何原因,您希望将此列设置为时间, 您可以进行另一次转换:

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

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