【问题标题】:calculating difference between timestamp values from same column计算来自同一列的时间戳值之间的差异
【发布时间】:2019-06-21 21:51:20
【问题描述】:

我正在将 Blf 文件转换为 Tab 分隔文件。我能够从下面列表中的文件中提取所有有用的信息。我想计算一列中时间戳值之间的差异。到目前为止,请找到我的代码:

import can
import csv
import datetime
import pandas as pd

filename = open('C:\\Users\\shraddhasrivastav\\Downloads\\BLF File\\output.csv', "w")
log = can.BLFReader('C:\\Users\\shraddhasrivastav\\Downloads\\BLF File\\test.blf')

# print ("We are here!")
log_output = []

for msg in log:
    msg = str(msg).split()
    #print (msg)

    data_list = msg[7:(7 + int(msg[6]))]

    log_output_entry = [(msg[1]), msg[3], msg[6], " ".join(data_list), msg[-1]]
    log_output_entry.insert(1, 'ID=')
    test_entry = " \t ".join(log_output_entry)  # join the list and remove string quotes in the csv file

    filename.write(test_entry + '\n')

df = pd.DataFrame(log_output)
df.columns = ['Timestamp', 'ID', 'DLC','Channel']

filename.close()  # Close the file outside the loop

到目前为止我得到的输出如下:

在我的第一列下,我想要时间戳值之间的差异(示例 - 第 2 行值 - 第 1 行时间戳值......第 4 行时间戳值 - 第 3 行时间戳值......等等...... . 我应该在我的代码中添加什么来实现这一点?

下面是我希望文件的时间戳字段看起来如何的屏幕截图。 (计算连续行之间的差异)

enter image description here

【问题讨论】:

  • 我编辑了您的格式,我相信您最后的部分问题已格式化到您的代码中,请检查它现在是否正确。

标签: python python-3.x pandas filenames python-datetime


【解决方案1】:

你可以使用pandas.DataFrame.shift:

df['Time Delta'] = df['Timestamp'] - df['Timestamp'].shift(periods=1, axis=0)

请记住,您当前拥有的文件似乎在您写入的文本文件中的列之间具有可变长度,因此可能很难直接插入 pandas。也许以下会起作用:

import can
import csv
import datetime
import pandas as pd

#filename = open('C:\\Users\\shraddhasrivastav\\Downloads\\BLF File\\output.csv', "w")
log = can.BLFReader('C:\\Users\\shraddhasrivastav\\Downloads\\BLF File\\test.blf')

# print ("We are here!")
log_output = []

for msg in log:
    msg = str(msg).split()
    #print (msg)

    data_list = msg[7:(7 + int(msg[6]))]

    log_output_entry = [(msg[1]), msg[3], msg[6], " ".join(data_list), msg[-1]]
    log_output_entry.insert(1, 'ID=')
    assert len(log_output_entry)==4
    log_output.append(log_output_entry)
    #test_entry = " \t ".join(log_output_entry)  # join the list and remove string quotes in the csv file

    #filename.write(test_entry + '\n')

df = pd.DataFrame(log_output)
df.columns = ['Timestamp', 'ID', 'DLC','Channel']
df['Timestamp'] = pd.to_datetime(df['Timestamp'],unit='s')
df['Time Delta'] = df['Timestamp'] - df['Timestamp'].shift(periods=1, axis=0)
df.to_csv('C:\\Users\\shraddhasrivastav\\Downloads\\BLF File\\output_df.csv')

#filename.close()  # Close the file outside the loop

【讨论】:

  • 出现以下错误:df['Time Delta'] = df['Timestamp'] - df['Timestamp'].shift(periods=1, axis=0) TypeError: 'function' object is not subscriptable
  • df=pd.DataFrame(log_output)之后需要设置数据框的列名,例如df.columns = ['Timestamp', 'ID', 'DLC']。不幸的是,从图像中不清楚将加载多少列,因此您需要调整列表以便为每列命名。
  • 我确实添加了您提到的以下内容。见原帖。不幸的是,它没有计算时间戳字段之间的差异。如果我在你的建议之后在我的原始代码中写了一些扭曲的东西,你能看看吗?
  • 我没有考虑的是列类型,其中 Timestamp 列仍然是一个字符串。 df['Timestamp'] = pd.to_datetime(df['Timestamp'],unit='s') 在差异计算之前应该可以解决问题。将扩展现有答案。
  • 您可以编辑您发布的代码吗?我没听懂你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多