【问题标题】:Subtract datetime columns of alternate rows in a for loop using python使用python在for循环中减去交替行的日期时间列
【发布时间】:2019-03-23 04:23:19
【问题描述】:

我在一个 csv 文件中有两个 csv 列,如下所示:

2019-03-22 12:51:04 2019-03-22 12:52:37
2019-03-22 12:50:38 2019-03-22 12:50:57

我想从 2019-03-22 12:51:04 中减去 2019-03-22 12:50:57,即它们都在不同的列和不同的行中。 当我有将近 300 行并且我想遍历所有行时,我们如何在 python 中做到这一点?

【问题讨论】:

  • 它将如何对数据帧的其余部分起作用。你会总是以相同的模式减去吗?基本上是 time1, date1 - time2, date2[1 position laged] ?
  • @rpm787 是的,对于 df 的其余部分,它将采用相同的模式
  • 刚刚在下面添加了一个解决方案。基本上,我结合 col1, col2 创建一个 fulltimedate1 列和 col3, col4 创建一个 fulltimedate2 列。然后做 fulltimedate1 - fulltimedate2(移位 -1 即 1 步)
  • @rpm787 这就是问题所在,我不知道 pandas 。我想用简单的 python 来做。像我们遍历一个二维数组来访问单元格并做减法
  • 这里我使用 csv reader 读取 csv 然后我需要能够在不使用 pandas 的情况下做到这一点,我发现大多数解决方案都在 pandas 中。

标签: python-3.x csv datetime


【解决方案1】:

我在这里尝试过。这对我有用,即使它不太漂亮。

import pandas as pd
import time

data = [['2019-03-22', '12:51:04','2019-03-22', '12:52:37'], ['2019-03-22', '12:50:38', '2019-03-22', '12:50:57']]
df = pd.DataFrame(data,columns=['d1','t1', 'd2', 't2' ])

def timestamp_(row, colNum):
    if colNum == 1:
        fulldate = time.mktime(time.strptime(row['d1']+ " " + row['t1'], "%Y-%m-%d %H:%M:%S"))
    elif colNum == 2:
        fulldate = time.mktime(time.strptime(row['d2']+ " " + row['t2'], "%Y-%m-%d %H:%M:%S"))
    return fulldate

df['fulltime1'] = df.apply(timestamp_, colNum=1, axis=1)
df['fulltime2'] = df.apply(timestamp_, colNum=2, axis=1)

df['timediff'] = df['fulltime1'] - df['fulltime2'].shift(-1)
#Answer will be in seconds.

【讨论】:

    【解决方案2】:

    使用datetimecsv,不需要pandas

    import csv
    from datetime import datetime
    import re
    
    row = []
    
    with open('dates.csv', newline='\n') as csvfile:
        reader = csv.reader(csvfile, delimiter=' ')
    
        for i, line in enumerate(reader):
    
    
            dt1 = datetime.strptime(' '.join(line[0:2]), '%Y-%m-%d %H:%M:%S')
            dt2 = datetime.strptime(' '.join(line[2:4]), '%Y-%m-%d %H:%M:%S')
    
            row.append([dt1, dt2])
    
    # row1column2 - row2column3 ?
    row1column2 = row[0][1]
    row2column3 = row[1][1] # ?
    
    result = row1column2 - row2column3
    
    print(result)
    

    输出:

    0:01:40
    

    可能会提高解析每行日期的效率,但到目前为止,这可能适合您的需求。

    【讨论】:

    • 不,他们是从同一行而不是从不同行减去列,请参阅我的问题,我已经要求我必须从 row1column2-row2column3 中减去类似这样的内容
    • 当然可以,只需调整行索引
    • 调整索引不会改变行它会改变列并保持在同一行。你能告诉我你会怎么做吗
    • @0decimal0 你想从row1column2-row2column3中减去,但是你的csv只有两个csv列,column3在哪里?
    • csv 文件中的分隔符/单元格分隔符是什么?我的意思是什么字符分隔列?空间?有多少列?您的问题是 2 列,但您的评论建议 3 列或更多列?
    猜你喜欢
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 2021-05-17
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多