我是编程新手。我几个月前才开始工作,希望能得到一些帮助。
我有一个航班延误数据集,列'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_datetime
和format
,%H%M
匹配HHMM
和errors='coerce'
,NaT
如果无法解析,最后使用Series.dt.time
:
df['CRSDepTime'] = pd.to_datetime(df['CRSDepTime'], format='%H%M', errors='coerce').dt.time
对于日期时间的矢量化解决方案需要to_datetime
,只需要Day
列名,并添加Hour
和Minute
列:
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