pandas 是否有一个函数可以将time HHMM(df列中的int64)转换为datetime对象?

rn0zuynd  于 2022-11-20  发布在  其他
关注(0)|答案(2)|浏览(135)

我是编程新手。几个月前刚开始,我希望能得到一些帮助。
我有一个航班延误数据集,列为“年”、“月”、“月日”、“周日”和“CRSDepTime”,数据类型为int 64。
Screenshot of df
我需要执行分析和可视化,以确定延迟最少的月份、日期和时间。
你建议把所有的数据类型都转换成日期时间吗?我可以使用Pandas的to_datetime()函数吗?如果可以,格式应该是什么?
提前感谢!:)
我试探着:

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

但我不太确定的格式,它总是给:值错误:时间数据'1605'与格式'HHMM'不匹配(匹配)

5tmbdcev

5tmbdcev1#

使用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)
tgabmvqs

tgabmvqs2#

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

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

相关问题