【问题标题】:how to split date and time from same column in csv using python?如何使用python从csv中的同一列拆分日期和时间?
【发布时间】:2017-06-26 20:53:24
【问题描述】:

我在 csv 文件中有第一列(PERIOD_START_TIME),其中包含日期和时间,但我需要将它们分成两个不同的列(日期、时间),所以我需要你的帮助......

PERIOD_START_TIME   
01.31.2017 13:00:00  
01.31.2017 14:00:00  
01.31.2017 15:00:00  
01.31.2017 16:00:00  
01.31.2017 17:00:00  
01.31.2017 18:00:00  
01.31.2017 19:00:00  
01.31.2017 20:00:00  
01.31.2017 21:00:00  
01.31.2017 22:00:00  
01.31.2017 23:00:00  
02.01.2017 00:00:00  
02.01.2017 01:00:00  
02.01.2017 02:00:00  
02.01.2017 03:00:00  

【问题讨论】:

    标签: python date csv pandas datetime


    【解决方案1】:

    您的PERIOD_START_TIME 可能不是datetime。以确保它是。

    df['PERIOD_START_TIME'] = pd.to_datetime(df['PERIOD_START_TIME'])
    

    通过dt 访问器访问datetime 属性。

    df['date'] = df.PERIOD_START_TIME.dt.date
    df['time'] = df.PERIOD_START_TIME.dt.time
    
    print(df)
    
         PERIOD_START_TIME        date      time
    0  2017-01-31 13:00:00  2017-01-31  13:00:00
    1  2017-01-31 14:00:00  2017-01-31  14:00:00
    2  2017-01-31 15:00:00  2017-01-31  15:00:00
    3  2017-01-31 16:00:00  2017-01-31  16:00:00
    4  2017-01-31 17:00:00  2017-01-31  17:00:00
    5  2017-01-31 18:00:00  2017-01-31  18:00:00
    6  2017-01-31 19:00:00  2017-01-31  19:00:00
    7  2017-01-31 20:00:00  2017-01-31  20:00:00
    8  2017-01-31 21:00:00  2017-01-31  21:00:00
    9  2017-01-31 22:00:00  2017-01-31  22:00:00
    10 2017-01-31 23:00:00  2017-01-31  23:00:00
    11 2017-02-01 00:00:00  2017-02-01  00:00:00
    12 2017-02-01 01:00:00  2017-02-01  01:00:00
    13 2017-02-01 02:00:00  2017-02-01  02:00:00
    14 2017-02-01 03:00:00  2017-02-01  03:00:00
    

    设置

    import pandas as pd
    from io import StringIO
    
    txt = """PERIOD_START_TIME
    01.31.2017 13:00:00  
    01.31.2017 14:00:00  
    01.31.2017 15:00:00  
    01.31.2017 16:00:00  
    01.31.2017 17:00:00  
    01.31.2017 18:00:00  
    01.31.2017 19:00:00  
    01.31.2017 20:00:00  
    01.31.2017 21:00:00  
    01.31.2017 22:00:00  
    01.31.2017 23:00:00  
    02.01.2017 00:00:00  
    02.01.2017 01:00:00  
    02.01.2017 02:00:00  
    02.01.2017 03:00:00  """
    
    df = pd.read_csv(StringIO(txt), parse_dates=[0])
    

    【讨论】:

    • 谢谢,但它不起作用:AttributeError: Can only use .dt accessor with datetimelike values
    • 现在是未知的字符串格式当我使用这个时: df = df.assign(DATETIME = pd.to_datetime(df['PERIOD_START_TIME'])) df = df.assign(DATE = df['DATETIME '].map(lambda t: t.date())) df = df.assign(TIME = df['DATETIME'].map(lambda t: t.time())) 它不能打印df,那里没有错误,但什么也没有发生,就像它被冻结了一样
    • @jovicbg 道歉...我有一个错字。再试一次。
    • 我认为它有效,但就像我说的那样,当我这样做时,无论以这种方式或其他方式,我都无法打印,我尝试使用 df 和 df.head(),但没有任何效果。问题是别的,重新启动内核,没有帮助,可以在我删除用于分割日期时间的代码行时打印。
    • @jovicbg 对不起,我不知道问题出在哪里。
    【解决方案2】:

    如果您需要将“PERIOD_START_TIME”列拆分为“DATE”和“TIME”列,我相信下面的代码可以做到(Python 3):

    #!/usr/bin/env python3
    # you may have to change "python3" to "python" depending on your setup.
    
    import csv
    
    # assuming your csv is separated by spaces, like the sample 
    # also assuming that the the input file is named 'input.csv'
    with open('input.csv', newline='') as csv_input: 
        csv_reader = csv.reader(csv_input, delimiter=' ')
        next(csv_reader)  # skips the header
        with open('output.csv', 'w', newline='') as csv_output:
            csv_writer = csv.writer(csv_output, delimiter=' ')
            csv_writer.writerow(['DATE', 'TIME'])
            for row in csv_reader:
                csv_writer.writerow([row[0], row[1]])
    

    【讨论】:

    • 我发现了很多错误、换行符、未定义 csv 等,但我认为我的 csv 文件有问题,所以现在没有任何帮助。谢谢。
    • 添加了 shebang 行以指定 python 环境,这应该修复“未定义”错误。您可以根据您的设置将 python3 更改为 python、python3.6 等。另外,在文件末尾添加空行:)
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2022-01-14
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多