高效的时间增量计算器

时间:2018-09-01 23:49:08

标签: python datetime timedelta

我有一个来自数据记录器的时间序列数据,该数据记录了时间戳记(以日期MM--DD-YY HH:MM:SS:xxx:yyy的形式显示(例如-[29.08.2018 16:26: 31.406]-),其中xxx和yyy分别是毫秒和微秒)在记录数据时精确到微秒。现在您可以想象,几分钟记录的生成文件可能很大。 (100兆字节)。我需要从这个文件中绘制出一堆数据与时间的关系,以毫秒为单位(理想情况下)。 数据如下所示: Snapshot of datafile

因此,我需要在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

预先感谢

1 个答案:

答案 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  

如果文件很大,则可以通过在适当位置编辑列而不是像我一样创建新列来提高效率。