我有一个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
答案 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的其他输入列使用相同的方法。