我有这样的数据:
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_M
列变成一个“时间”列,现在是从午夜开始的秒,而不是常规的24小时时间。你知道吗
我的问题是,这需要一段时间来运行。有没有更有效的方法来做同样的事情?你知道吗
日期时间转换可能很昂贵。所以,让我们尽量避免它们:
最明显的优化:
相同的日期和时间(一直到小数点)是重复的,因此最好只在它们更改时进行转换,并使用上一次转换的结果,只要它们保持不变(对于可能会重复很多次的数据)。你知道吗
当它们改变时,你甚至不必在你的案例中使用日期时间转换。对于日期,您可以简单地使用子字符串插入
'-'
,对于时间,可以很容易地计算秒数,而不首先转换为时间或日期时间。只需提取3个部分,乘以3600,60,再加上秒数。你知道吗使用
pandas
有一种更简单的方法。你知道吗一般来说,避免使用
lambda
,因为这只是一个伪装得很差、效率通常很低的循环。你知道吗注意,date的输出是一个
datetime
对象。在内部,它表示为整数。破折号只是用来表示的。你知道吗如果你真的需要破折号,你需要把转换回字符串,除非绝对需要,否则我不推荐。你知道吗
相关问题 更多 >
编程相关推荐