我有一个来自数据记录器的时间序列数据,该数据记录了时间戳记(以日期MM--DD-YY HH:MM:SS:xxx:yyy的形式显示(例如-[29.08.2018 16:26: 31.406]-),其中xxx和yyy分别是毫秒和微秒)在记录数据时精确到微秒。现在您可以想象,几分钟记录的生成文件可能很大。 (100兆字节)。我需要从这个文件中绘制出一堆数据与时间的关系,以毫秒为单位(理想情况下)。 数据如下所示:
因此,我需要在python中解析这些日期并计算timedelta以找到样本之间的间隔时间,然后生成图。当我减去这两个时间戳(-[29.08.2018 16:23:41.052]-和-[29.08.2018 16:23:41.114]-)时,我想获得62毫秒作为时间间隔这两个时间戳。
当前,我正在使用“ dateparser”(通过将dateparser导入为dp)来解析后输出datetime,然后我可以减去这些以提取timedelta,然后根据需要转换为ms或秒。 但是此功能花费的时间太长,并且是我后期处理脚本中的瓶颈。
任何人都可以建议一个更好的库,该库在解析日期和计算timedelta时效率更高?
这是效率不高的代码
import dateparser as dp
def timedelta_local(date1, date2):
import dateparser as dp
timedelta = dp.parse(date2)-dp.parse(date1)
timediff={'us': timedelta.microseconds+timedelta.seconds*1000000+timedelta.days*24*60*60*1000000,
'ms':timedelta.microseconds/1000+timedelta.seconds*1000+timedelta.days*24*60*60*1000,
'sec': timedelta.microseconds/1000000+timedelta.seconds+timedelta.days*24*60*60,
'minutes': timedelta.microseconds/1000000/60+timedelta.seconds/60+timedelta.days*24*60
}
return timediffe
预先感谢
答案 0 :(得分:0)
@zvone在这里是正确的。熊猫是您最好的朋友。这是一些示例代码,有望使您步入正轨。假设您的数据位于CSV文件中,并且标题行与示例中显示的标题行相同。我不确定您是想将时差保留为timedelta对象(易于进行进一步的数学运算)还是将其简化为浮点数。我都做过。
import pandas as pd
df = pd.read_csv("test.csv", parse_dates=[0])
# What are the data types after the initial import?
print(f'{df.dtypes}\n\n')
# What are the contents of the data frame?
print(f'{df}\n\n')
# Create a new column that strips away leading and trailing characters
# that surround the data we want
df['Clean Time Stamp'] = df['Time Stamp'].apply(lambda x: x[3:-4])
# Convert to a pandas Timestamp. Use infer_datetime_format for speed.
df['Real Time Stamp'] = pd.to_datetime(df['Clean Time Stamp'], infer_datetime_format=True)
# Calculate time difference between successive rows
df['Delta T'] = df['Real Time Stamp'].diff()
# Convert pandas timedelta to a floating point value in milliseconds.
df['Delta T ms'] = df['Delta T'].dt.total_seconds() * 1000
print(f'{df.dtypes}\n\n')
print(df)
输出看起来像这样。请注意,数据框的打印将列环绕到另一行-这只是打印它的人工产物。
Time Stamp object
Limit A int64
Value A float64
Limit B int64
Value B float64
dtype: object
Time Stamp Limit A Value A Limit B Value B
0 --[ 29.08.2018 16:23:41.052 ] -- 15 3.109 30 2.907
1 --[ 29.08.2018 16:23:41.114 ] -- 15 3.020 30 8.242
Time Stamp object
Limit A int64
Value A float64
Limit B int64
Value B float64
Clean Time Stamp object
Real Time Stamp datetime64[ns]
Delta T timedelta64[ns]
Delta T ms float64
dtype: object
Time Stamp Limit A Value A Limit B Value B \
0 --[ 29.08.2018 16:23:41.052 ] -- 15 3.109 30 2.907
1 --[ 29.08.2018 16:23:41.114 ] -- 15 3.020 30 8.242
Clean Time Stamp Real Time Stamp Delta T \
0 29.08.2018 16:23:41.052 2018-08-29 16:23:41.052 NaT
1 29.08.2018 16:23:41.114 2018-08-29 16:23:41.114 00:00:00.062000
Delta T ms
0 NaN
1 62.0
如果文件很大,则可以通过在适当位置编辑列而不是像我一样创建新列来提高效率。