【问题标题】:Amending datetime format while parsing from csv read - pandas从 csv 读取解析时修改日期时间格式 - pandas
【发布时间】:2017-02-18 23:20:25
【问题描述】:

我正在将一个 csv 文件 (SimResults_Daily.csv) 读入 pandas,其结构如下:

#, Job_ID, Date/Time, value1, value2,
0, ID1,  05/01  24:00:00, 5, 6 
1, ID2,  05/02  24:00:00, 6, 15 
2, ID3,  05/03  24:00:00, 20, 21 

等等。 由于 pandas parse_dates 无法读取日期时间格式,我发现可以使用命令:str.replace('24:','00:')

我目前的代码是:

dateparse = lambda x: pd.datetime.strptime(x, '%m-%d  %H:%M:%S')

df = pd.read_csv('SimResults_Daily.csv',
    skipinitialspace=True,
    date_parser=dateparse,
    parse_dates=['Date/Time'],
    index_col=['Date/Time'],
    usecols=['Job_ID',
    'Date/Time',
    'value1',
    'value2',
    header=0)

我应该在代码的哪个位置实现str.replace 命令?

【问题讨论】:

    标签: python date csv parsing pandas


    【解决方案1】:

    你可以使用:

    import pandas as pd
    import io
    
    temp=u"""#,Job_ID,Date/Time,value1,value2,
    0,ID1,05/01 24:00:00,5,6
    1,ID2,05/02 24:00:00,6,15
    2,ID3,05/03 24:00:00,20,21"""
    
    dateparse = lambda x: pd.datetime.strptime(x.replace('24:','00:'), '%m/%d  %H:%M:%S')
    
    #after testing replace io.StringIO(temp) to filename
    df = pd.read_csv(io.StringIO(temp),
        skipinitialspace=True,
        date_parser=dateparse,
        parse_dates=['Date/Time'],
        index_col=['Date/Time'],
        usecols=['Job_ID', 'Date/Time', 'value1', 'value2'],
        header=0)
    
    print (df)
               Job_ID  value1  value2
    Date/Time                        
    1900-05-01    ID1       5       6
    1900-05-02    ID2       6      15
    1900-05-03    ID3      20      21
    

    也可以添加另一个带有双 replace - year 的解决方案:

    dateparse = lambda x: x.replace('24:','00:').replace(' ','/1900 ')
    
    df = pd.read_csv(io.StringIO(temp),
        skipinitialspace=True,
        date_parser=dateparse,
        parse_dates=['Date/Time'],
        index_col=['Date/Time'],
        usecols=['Job_ID', 'Date/Time', 'value1', 'value2'],
        header=0)
    
    print (df)
               Job_ID  value1  value2
    Date/Time                        
    1900-05-01    ID1       5       6
    1900-05-02    ID2       6      15
    1900-05-03    ID3      20      21
    

    dateparse = lambda x: x.replace('24:','00:').replace(' ','/2016 ')
    
    df = pd.read_csv(io.StringIO(temp),
        skipinitialspace=True,
        date_parser=dateparse,
        parse_dates=['Date/Time'],
        index_col=['Date/Time'],
        usecols=['Job_ID', 'Date/Time', 'value1', 'value2'],
        header=0)
    
    print (df)
               Job_ID  value1  value2
    Date/Time                        
    2016-05-01    ID1       5       6
    2016-05-02    ID2       6      15
    2016-05-03    ID3      20      21
    

    【讨论】:

    • 你总是在现场!
    • 我面临着导入类似数据集的任务,使用每小时而不是每天的值。因此,与其将24: 替换为00:,不如将​​所有时间向后移动1 个单位,即:24: -> 23:,...,01: -> 00:。代码将如何改变来做到这一点?
    • 我也是这么想的,只是像df.index = df.index - pd.Timedelta(1, unit='h')这样减去一小时
    • 不幸的是,我认为不是。
    • 问题是小时 24:00 无法被 pandas 识别,将其替换为 00:00 会将数据点发送回一天的开始......
    猜你喜欢
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2015-09-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多