【问题标题】:From Dataframe to Datestamp python3从数据框到时间戳 python3
【发布时间】:2018-12-05 06:30:04
【问题描述】:

最近我遇到了一个非常奇怪的 csv 文件,它有 2 列(带标题),一列用于日期,第二列用于价格。时间格式为“dd.mm.yyyy”。

d = {'Date': [31.12.1991, 02.01.1992, 03.01.1992, 06.01.1992], 
     'Prices': [9.62, 9.5, 9.73, 9.45]}
df = pd.DataFrame(data=d)
prices = pd.DataFrame(df['Prices'])
date = pd.DataFrame(df['Date'])
date = date.to_string(header=True)
date = df.to_datetime(utc=True, infer_datetime_format=True)
frame = date.join(values)
print(df)

我试图通过隔离日期列并尝试首先使用 to_string() 函数将其转换为字符串然后使用 to_datetime 恢复日期来使其工作,但它没有用。

有什么建议吗? 提前致谢

【问题讨论】:

    标签: python-3.x pandas dataframe timestamp


    【解决方案1】:

    对整个数据帧进行泛化的有趣方式

    注意这使用errors='ignore' 来跳过可能不适合解析为日期的列。但是,折衷方案是,如果有一列旨在被解析为日期但日期值错误,则此方法将使该列保持不变。关键是确保您没有错误的日期值。

    df.assign(
        **df.select_dtypes(exclude=[np.number]).apply(
            pd.to_datetime, errors='ignore', dayfirst=True
        )
    )
    
            Date  Prices
    0 1991-12-31    9.62
    1 1992-01-02    9.50
    2 1992-01-03    9.73
    3 1992-01-06    9.45
    

    另一个例子

    df = pd.DataFrame(dict(
        A=1, B='B', C='6.7.2018', D=1-1j,
        E='1.2.2017', F=pd.Timestamp('2016-08-08')
    ), [0])
    
    df
    
       A  B         C       D         E          F
    0  1  B  6.7.2018  (1-1j)  1.2.2017 2016-08-08
    

    df.assign(
        **df.select_dtypes(exclude=[np.number]).apply(
            pd.to_datetime, errors='ignore', dayfirst=True
        )
    )
    
       A  B          C       D          E          F
    0  1  B 2018-07-06  (1-1j) 2017-02-01 2016-08-08
    

    设置

    从耶斯瑞尔借来的

    d = {'Date': ['31.12.1991', '02.01.1992', '03.01.1992', '06.01.1992'], 
         'Prices': [9.62, 9.5, 9.73, 9.45]}
    df = pd.DataFrame(data=d)
    

    【讨论】:

    • 嗯,errors='ignore' 不是好主意,如果日期时间不好,也许你可以指出需要所有有效日期。
    【解决方案2】:

    您可以在读取文件时尝试解析日期。您可以指定格式先是日期而不是月份。

    import pandas as pd
    df = pd.read_csv('test.csv', parse_dates=['Date'], dayfirst=True)
    
    print(df)
    #        Date   Prices
    #0 1991-12-31     9.62
    #1 1992-01-02     9.50
    #2 1992-01-03     9.73
    #3 1992-01-06     9.45
    
    df.dtypes
    #Date      datetime64[ns]
    #Prices           float64
    #dtype: object
    

    但是,您的数据确实需要干净且格式正确才能正常工作:

    解析日期:

    • 如果列或索引包含无法解析的日期,整个列 或索引将作为对象数据类型原样返回。为了 非标准日期时间解析,在 pd.read_csv 之后使用 pd.to_datetime

    样本数据:test.csv

    Date,Prices
    31.12.1991,9.62
    02.01.1992,9.5
    03.01.1992,9.73
    06.01.1992,9.45
    

    【讨论】:

    • 非常感谢!我不认为我可以通过返回 CSV 来解决问题 =)
    【解决方案3】:

    我认为需要:

    d = {'Date': ['31.12.1991', '02.01.1992', '03.01.1992', '06.01.1992'], 
         'Prices': [9.62, 9.5, 9.73, 9.45]}
    df = pd.DataFrame(data=d)
    
    df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
    print (df)
            Date  Prices
    0 1991-12-31    9.62
    1 1992-01-02    9.50
    2 1992-01-03    9.73
    3 1992-01-06    9.45
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2021-02-28
      • 2021-07-09
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2019-07-04
      相关资源
      最近更新 更多