是否有一个函数来转换时间HHMM(在df列int64)到一个日期时间对象?



我是编程新手。我几个月前才开始工作,希望能得到一些帮助。

我有一个航班延误数据集,列'Year', 'Month', 'DayOfMonth', 'DayOfWeek'和'CRSDepTime'与int64 Dtype。

df

截图我需要进行分析和可视化,以确定延误最少的月份、日期和时间。

你会建议将所有的dtype转换为datetime吗?我可以使用熊猫的to_datetime()函数吗?如果是,格式应该是什么?

提前感谢!:)

我试着:

df['CRSDepTime'] = pd.to_datetime(df['CRSDepTime'], format='HHMM')

但是我不太确定格式,它总是给出:ValueError:时间数据'1605'不匹配格式'HHMM' (match)

使用to_datetimeformat,%H%M匹配HHMMerrors='coerce',NaT如果无法解析,最后使用Series.dt.time:

df['CRSDepTime'] = pd.to_datetime(df['CRSDepTime'], format='%H%M', errors='coerce').dt.time

对于日期时间的矢量化解决方案需要to_datetime,只需要Day列名,并添加HourMinute列:

cols = ['Year', 'Month', 'DayOfMonth']
df['date'] = (pd.to_datetime(df[cols].rename(columns={'DayOfMonth':'Day'})
.assign(Hour=df['CRSDepTime'] // 100, Minute=df['CRSDepTime'] % 100)))

print (df)
Year  Month  DayOfMonth  DayOfWeek  CRSDepTime                date
0  2005      1          28          5        1605 2005-01-28 16:05:00
1  2005      1          29          6        1605 2005-01-29 16:05:00
2  2005      1          30          7        1610 2005-01-30 16:10:00
3  2005      1          31          1        1605 2005-01-31 16:05:00
4  2005      1           2          7        1900 2005-01-02 19:00:00
5  2005      1           3          1        1900 2005-01-03 19:00:00

:

#6k rows
df = pd.concat([df] * 1000, ignore_index=True)

#Tim Roberts solution
In [51]: %timeit df.apply(translate,axis=1)
173 ms ± 2.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [52]: %timeit (pd.to_datetime(df[['Year', 'Month', 'DayOfMonth']].rename(columns={'DayOfMonth':'Day'}).assign(Hour=df['CRSDepTime'] // 100, Minute=df['CRSDepTime'] % 100)))
6.23 ms ± 181 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

假设这些都是整数,您可以通过以下方式获得该行的单个时间戳:

import pandas as pd
import datetime
data = [
[2005,1,28,5,1605],
[2005,1,29,6,1605],
[2005,1,30,7,1610],
[2005,1,31,1,1605],
[2005,1,2,7,1900],
[2005,1,3,1,1900],
]
def translate(row):
return datetime.datetime( row['Year'],row['Month'],row['DayOfMonth'],row['CRSDepTime']//100, row['CRSDepTime']%100)
df = pd.DataFrame(data, columns=['Year','Month','DayOfMonth','DayOfWeek','CRSDepTime'])
df['timestamp'] = df.apply(translate,axis=1)
print(df)

输出:

Year  Month  DayOfMonth  DayOfWeek  CRSDepTime           timestamp
0  2005      1          28          5        1605 2005-01-28 16:05:00
1  2005      1          29          6        1605 2005-01-29 16:05:00
2  2005      1          30          7        1610 2005-01-30 16:10:00
3  2005      1          31          1        1605 2005-01-31 16:05:00
4  2005      1           2          7        1900 2005-01-02 19:00:00
5  2005      1           3          1        1900 2005-01-03 19:00:00

最新更新