2016-09-24 100 views
0

我有一个.dat文件,它需要一列中的数千行(比如说,列是time,t),现在我想查找间隔在列中的行之间,这意味着从第一行减去第二行的值,等等。(找到dt)。然后我想用这些间隔值创建一个新列,并将其与原始列进行比较。如果python以外的任何其他语言在这种情况下都有帮助,我也会赞赏他们的建议。
我写了一个伪Python代码为:在python熊猫数据框中从前面的行中减去列的行

import pandas as pd 
import numpy as np 
from sys import argv 
from pylab import * 


import csv 



script, filename = argv 


# read flash.dat to a list of lists 
datContent = [i.strip().split() for i in open("./flash.dat").readlines()] 

# write it as a new CSV file 
with open("./flash.dat", "wb") as f: 
    writer = csv.writer(f) 
    writer.writerows(datContent) 


columns_to_keep = ['#time'] 
dataframe = pd.read_csv("./flash.csv", usecols=columns_to_keep) 


df = pd.DataFrame({"#time"}) 
df["#time"] = df["#time"] + [pd.Timedelta(minutes=m) for m in np.random.choice(a=range(60), size=df.shape[0])] 
df["value"] = np.random.normal(size=df.shape[0]) 

df["prev_time"] = [np.nan] + df.iloc[:-1]["#time"].tolist() 
df["time_delta"] = df.time - df.prev_time 
df 

pd.set_option('display.height', 1000) 
pd.set_option('display.max_rows', 1000) 
pd.set_option('display.max_columns', 500) 
pd.set_option('display.width', 1000) 

dataframe.plot(x='#time', y='time_delta', style='r') 

print dataframe 

show() 

更新我的代码,我也是共享的.dat文件我的工作。执行涉及来自不同行的值的操作 https://www.dropbox.com/s/w4jbxmln9e83355/flash.dat?dl=0

+1

大熊猫的转换功能应该有所斩获。 –

回答

1

一个简单的方法是简单地复制所需的值一个在同一行,然后应用一个简单的行方式运行。

例如,在你的榜样,我们就会有一个time列中的数据框和其他一些数据,比如:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({"time": pd.date_range("24 sept 2016", periods=5*24, freq="1h")}) 
df["time"] = df["time"] + [pd.Timedelta(minutes=m) for m in np.random.choice(a=range(60), size=df.shape[0])] 
df["value"] = np.random.normal(size=df.shape[0]) 

enter image description here

如果要计算从时间差在一个(或下,或其他)行,你可以简单地将值从它复制,然后执行减法:

df["prev_time"] = [np.nan] + df.iloc[:-1]["time"].tolist() 
df["time_delta"] = df.time - df.prev_time 
df 

enter image description here

+0

我用你的建议更新了我的代码,但是我有一些错误,因为我的文件没有按分钟等数据保存数据。我分享了我正在处理的原始数据文件,请你花些时间看看它并更新你的代码指定给我的文件。 – bhjghjh

+0

嗨。我看看你的文件,据我猜测它已经包含时间增量而不是日期,可能表示为毫秒或纳秒的数量?同样的逻辑也适用,一旦你在数据框中加载了文件,比如在变量'df'中,你可以用'df [“time”] = df.time.apply(lambda ms: pd.Timedelta(毫秒= ms))'(使毫秒适应列的含义)。之后,我发布的代码应该像下面这样工作:时间戳的差异或时间差的差异都会产生时间差异。 – Svend

+0

感谢问题解决 – bhjghjh

相关问题