熊猫数据框-to_json()to_csv()对于iso格式的日期的作用不同

时间:2018-11-27 07:08:41

标签: python pandas dataframe

我正在从我的API中获取iso格式的日期。

我正在做的事情:

df = DataFrame(results)
df.to_csv(path_or_buf=file_name, index=False, encoding='utf-8',
          compression='gzip',
          quoting=QUOTE_NONNUMERIC)

例如,我查看CSV:

lastDeliveryDate
2018-11-21 16:25:53.990000-05:00

但是,

当我这样做时:

df = DataFrame(results)
df.to_json(path_or_buf=file_name, orient="records",compression='gzip', lines=True)

我看到了(其他记录):

"lastDeliveryDate":1543258826689

这是个问题。

当我将数据从CSV加载到Google BigQuery时,eveything很好。日期已正确解析。

但是当我将加载更改为Json时。它不能正确解析日期。

我看到以下格式的日期:

50866-01-09 23:46:40 UTC

之所以会这样,是因为to_json()to_csv()iso_format中的日期产生了不同的结果

我该如何解决?我是否必须编辑数据框并将所有日期列转换为常规UTC?我怎样才能做到这一点?以及为什么to_json()不需要for to_csv()

How do I translate an ISO 8601 datetime string into a Python datetime object?所述:

df["lastDeliveryDate"] = dateutil.parser.parse(df["lastDeliveryDate"])  

但是它给出了:

  

TypeError:解析器必须是字符串或字符流,而不是Series

2 个答案:

答案 0 :(得分:2)

Pandas documentation on to_json()

  

日期格式 {无,“时代”,“ iso”}
  日期转换的类型。 “ epoch” =纪元毫秒,“ iso” = ISO8601。默认值取决于方向。对于orient='table',默认值为“ iso”。对于所有其他东方,默认值为“时代”。

因此,对于orient="records",您必须设置date_format="iso"才能获得日期时间格式,以后可以理解:

df.to_json(path_or_buf=file_name, orient="records", date_format="iso", 
           compression='gzip', lines=True)

答案 1 :(得分:1)

基本上dateutil.parser.parse()期望使用字符串作为参数,但是您传递了整个列。尝试使用lambda函数:

df["lastDeliveryDate"] = df["lastDeliveryDate"].apply( lambda row: dateutil.parser.parse(row))