如何解析具有特定格式的熊猫中的日期时间

时间:2018-11-27 16:21:48

标签: python-3.x pandas

我有一个来自API的直接CSV流,该API正在使用以下代码将数据推送到数据库中:

def loadData(data, engine) :
stream = data.content

try:
    df = pd.read_csv(io.StringIO(stream.decode('utf-8')))
    df['Snapshot'] = datetime.datetime.now()

    if file.split(".")[0] == "SIM_SDS" :
        df.to_sql(file.split(".")[0], engine, if_exists='append', index=False, infer_datetime_format = True)
    else :
        df.to_sql(file.split(".")[0], engine, if_exists='replace', index=False, infer_datetime_format = True)
except:
    print('Loading data to the database failed for ' + file)

我遇到的问题是传入的日期时间格式是YYYY-MM-DDTHH:MM:SS.SSSZ(例如,2017年10月30日T20:26:22.731Z)

我发现了很多不同的版本,其中只有一个T或带有+0300的T,但是我还没有找到这种特殊的格式,我似乎无法将其解析为日期时间。挑战的另一部分是,日期时间字段在每种情况下都不相同,因此我还必须有一种将这种格式识别为日期时间的方法。

由于字段以文本形式显示,因此在数据库中创建表时会产生问题。当这些在Tableau中用于datediff类型的工作时,会导致问题。

尝试1:

dateCol = [col for col in df.columns if 'Date' in col]
    for col in dateCol:
        df[col] = df[col].map(lambda x: x.strip('T').strip('Z'))
        print(df[col])

我认为这失败了,因为NaN问题,该字段中没有日期。

1 个答案:

答案 0 :(得分:0)

使其可与以下各项一起使用:

def loadData(data, engine) :
    stream = data.content

try:
    df = pd.read_csv(io.StringIO(stream.decode('utf-8')))
    df['Snapshot'] = datetime.datetime.now()
    df.where(df.notnull(),None)
    dateCol = [col for col in df.columns if 'Date' in col]
    for col in dateCol:
        df[col] = pd.to_datetime(df[col])

    if file.split(".")[0] == "SIM_SDS" :
        df.to_sql(file.split(".")[0], engine, if_exists='append', index=False)
    else :
        df.to_sql(file.split(".")[0], engine, if_exists='replace', index=False)
except:
    print('Loading data to the database failed for ' + file)

这将导致表格字段的正确格式,我确定应该将datetimes设置为datetimes。

请随时给我一些改进的建议。