Python 快速日期和时间转换

Python 快速日期和时间转换,python,performance,pandas,datetime,time,Python,Performance,Pandas,Datetime,Time,我有如下数据: DATE TIME_M EX BID ASK SYM_ROOT SYM_SUFFIX 0 20180312 9:30:00.052465558 V 41.67 43.77 TRIP NaN 1 20180312 9:30:00.207724531 B 41.66 43.61 TRIP NaN 2 20180312 9:30:00.208090941 K

我有如下数据:

       DATE             TIME_M EX    BID    ASK SYM_ROOT  SYM_SUFFIX
0  20180312  9:30:00.052465558  V  41.67  43.77     TRIP         NaN
1  20180312  9:30:00.207724531  B  41.66  43.61     TRIP         NaN
2  20180312  9:30:00.208090941  K  40.80  44.76     TRIP         NaN
3  20180312  9:30:00.208116618  Z  41.62  43.83     TRIP         NaN
4  20180312  9:30:00.208691471  V  40.76  43.77     TRIP         NaN
        DATE EX    BID    ASK          time
0 2018-03-12  V  41.67  43.77  34200.052466
1 2018-03-12  B  41.66  43.61  34200.207725
2 2018-03-12  K  40.80  44.76  34200.208091
3 2018-03-12  Z  41.62  43.83  34200.208117
4 2018-03-12  V  40.76  43.77  34200.208691
为了使它看起来像这样:

       DATE             TIME_M EX    BID    ASK SYM_ROOT  SYM_SUFFIX
0  20180312  9:30:00.052465558  V  41.67  43.77     TRIP         NaN
1  20180312  9:30:00.207724531  B  41.66  43.61     TRIP         NaN
2  20180312  9:30:00.208090941  K  40.80  44.76     TRIP         NaN
3  20180312  9:30:00.208116618  Z  41.62  43.83     TRIP         NaN
4  20180312  9:30:00.208691471  V  40.76  43.77     TRIP         NaN
        DATE EX    BID    ASK          time
0 2018-03-12  V  41.67  43.77  34200.052466
1 2018-03-12  B  41.66  43.61  34200.207725
2 2018-03-12  K  40.80  44.76  34200.208091
3 2018-03-12  Z  41.62  43.83  34200.208117
4 2018-03-12  V  40.76  43.77  34200.208691
我创建了以下函数:

def transform_date_time(file):
    # Transform DATE format to include hiffens:
    file['DATE'] = file['DATE'].apply(lambda x: datetime.datetime.strptime(str(x), '%Y%m%d'))

    # Join DATE and TIME_M
    file["newtime"] = pd.to_datetime(file["DATE"].astype(str) +" "+ file["TIME_M"].map(str))

    # Get seconds from midnight
    file["midnight"] = pd.to_datetime(file["DATE"].astype(str) + " " + "00:00:00.000000000")
    file['time'] = file["newtime"] - file["midnight"]  # in timedelta format
    file['time'] = file['time'].apply(lambda x: x.total_seconds())

    # Delete columns that will not be used
    columns = ['SYM_ROOT', 'SYM_SUFFIX','TIME_M','newtime','midnight']
    file.drop(columns, inplace=True, axis=1)

    return file
因此,我要做的是将
DATE
列转换为包含连字符的列,
TIME\u M
列变成一个“TIME”列,现在是从午夜开始的秒,而不是常规的24小时时间


我的问题是,这需要一段时间来运行。有没有更有效的方法来做同样的事情?

有一种更简单的方法可以使用
pandas

df['DATE'] = pd.to_datetime(df['DATE'], format='%Y%m%d')
df['TIME_M'] = pd.to_timedelta(df['TIME_M']).dt.total_seconds()
一般情况下,避免使用
lambda
,因为这只是一个伪装不好且通常效率低下的循环

请注意,日期的输出是一个
datetime
对象。在内部,它表示为一个整数。破折号只是用来演示的


如果您确实需要破折号,则需要将其转换回字符串,除非绝对需要,否则我不推荐使用此功能。

日期时间转换可能会很昂贵。因此,让我们尽可能避免它们:

最明显的优化:

相同的日期和时间(直到小数点)是重复的,因此最好只在它们更改时进行转换,并且使用上一次转换的结果,只要它们保持不变(对于可能需要很多次的数据)


当它们发生变化时,您甚至不必在您的案例中使用日期时间转换。对于日期,您只需使用子字符串插入
“-”
,对于时间,无需先转换为时间或日期时间,即可轻松计算秒数。只需提取3个部分,乘以3600,60,再加上秒数。

这需要多长时间?你用什么来运行它?