【发布时间】:2019-10-29 18:12:20
【问题描述】:
Im writing a program that you put the log and it generates a csv about the exchange of virtual desktops, but Im 有一个大问题,因为它生成 csv 时会获取所有虚拟桌面 1,然后是所有 2、3、4、5 和 6。
我希望它在一天之内,我该怎么做?
我的代码现在是这样的,如何获取一天中的事件而不用数字分隔?
filepath = 'dgnet.log'
with open(filepath) as fp:
line = fp.readline()
cnt = 1
Fls = []
while line:
if "Taskbarbuttons auf Desktop" in line.strip():
loc = []
loc.append(line.strip().split("> ---")[0])
loc.append(line.strip().split("> ---")[1])
Fls.append(loc)
line = fp.readline()
cnt += 1
df = pd.DataFrame(Fls, columns=['Time', 'Name'])
gk = df.groupby('Name')
finallist = []
for name, group in gk:
g = group
g['Time2'] = g['Time'].shift(1)
for i in range(len(g)):
loc1 = []
if i % 2 == 0:
x = np.nan
else:
x = g.iloc[i, 2]
loc1.append(x)
loc1.append(g.iloc[i, 0])
loc1.append(g.iloc[i, 1])
finallist.append(loc1)
df1 = pd.DataFrame(finallist, columns=['StartTime', 'EndTime', 'Name'])
df1.fillna(0, inplace=True)
df2 = df1[df1['StartTime'] != 0]
df2['date'] = ""
d1 = 1
d = datetime.datetime.now()
l = len(df2)
Lxs = []
for i in range(len(df2)):
if i == 0:
df2.iloc[i, 3] = (datetime.datetime.now()).date()
if i != 0:
s = pd.to_datetime(df2.iloc[i, 0]).time()
e = pd.to_datetime(df2.iloc[i, 1]).time()
pe = pd.to_datetime(df2.iloc[i - 1, 1]).time()
if e > s:
df2.iloc[i, 3] = (datetime.datetime.now() + datetime.timedelta(days=d1)).date()
if pe > s:
d1 = d1 + 1
df2.iloc[i, 3] = (datetime.datetime.now() + datetime.timedelta(days=d1)).date()
# print(i,datetime.datetime.now() + datetime.timedelta(days=d1))
elif e < s:
df2.iloc[i, 3] = np.NaN
Lxs.append([df2.iloc[i, 0], "23:59:00", df2.iloc[i, 2],
(datetime.datetime.now() + datetime.timedelta(days=d1)).date()])
d1 = d1 + 1
Lxs.append(["00:00:01", df2.iloc[i, 1], df2.iloc[i, 2],
(datetime.datetime.now() + datetime.timedelta(days=d1)).date()])
l = l + 1
Lxsdf = pd.DataFrame(Lxs, columns=['StartTime', 'EndTime', 'Name', 'date'])
x = df2.append(Lxsdf)
x.fillna(0, inplace=True)
x1 = x[x['date'] != 0]
x1.index = x1['date']
x1.sort_index(inplace=True)
x1['EndTime'] = pd.to_datetime(x1['EndTime'])
x1['StartTime'] = pd.to_datetime(x1['StartTime'])
x1['s1'] = x1['EndTime'] - x1['StartTime']
x1.to_csv('file3.csv')
我希望是这样的:
taskbarbuttons auf desktop 1 = 50 seconds
taskbarbuttons auf desktop 2 = 1 minutes
目前是:
09:42:58 23:07:00 Taskbarbuttons auf Desktop 1
12:59:04 13:42:08 Taskbarbuttons auf Desktop 1
03:59:13 04:44:39 Taskbarbuttons auf Desktop 1
13:24:59 13:25:26 Taskbarbuttons auf Desktop 1
19:24:15 13:03:02 Taskbarbuttons auf Desktop 1
13:12:29 13:33:43 Taskbarbuttons auf Desktop 1
13:35:43 07:45:14 Taskbarbuttons auf Desktop 1
07:53:27 10:51:30 Taskbarbuttons auf Desktop 1
然后是所有 2、3、4、5 和 6。
【问题讨论】:
-
这个问题我已经读了两遍了,还是不知道你在问什么。
-
而不是
line = p.readline()(两次)和while line- 所以你有3行代码 - 你可以使用单行代码:for line in p:。从文件中读取行是一种非常流行的方法。 -
我不明白你们中的一些计算。您应该使用变量的名称,这意味着什么 - 即。
start_time代替s,end_time代替e。 -
可能大部分计算都可以在没有
for i in range(len(df2))的情况下完成,但使用像df['StartTime'] = pd.to_datetime(df['StartTime']).time()这样的一行 -
我会支持@furas 到目前为止所说的一切,并钦佩他们的耐心。你能包括一些示例数据吗?一旦我可以实际运行该程序,我就可以查看它。
标签: python pandas csv dataframe