导出到csv时松散的timedelta格式 - 是否有解决方案?

时间:2017-04-19 06:17:04

标签: pandas datetime export

我有一个带有日期时间对象的Pandas Dataframe(包括timedelta)。当我创建DF时一切都很好但是当我将它导出到csv然后再次导入时,datetime对象就是字符串。

我尝试使用

pd.read_csv('xyz.csv',parse_dates=True)
导入时

以及

df.to_csv('xyz.csv',date_format='%Y-%m-%d %H:%M:%S')

导出时。但它不起作用。

上下文: 我创建了一个生成数据的程序,将其放入pandas DF中,这些DF必须存储,直到下次打开程序为止。

所以我的问题是:有没有可能用CSV.format做到这一点?一般来说,导出pandas DF以保持尽可能多的属性的最佳格式是什么? 谢谢!

编辑:

数据样本: 这是DF中的一行(索引是datetime对象)。列是'任务' (字符串格式)和'持续时间' (这是timedelta对象)。

2017-04-18 08:11:39 | PyMC3_Book | 0天00:24:49.919194

2 个答案:

答案 0 :(得分:4)

这不是read_csv parse_dates参数的工作原理

From the Docs

  • parse_dates 布尔或整数或名称列表或列表或dict列表,默认为False
    • 布尔值。如果为True - >尝试解析索引。
    • 整体或名称列表。例如如果[1,2,3] - >尝试将第1,2,3列分别解析为单独的日期列。
    • 列表清单。例如如果[[1,3]] - >将第1列和第3列组合在一起并解析为 单日期栏。
    • dict,例如{'foo':[1,3]} - >将第1,3列解析为日期并调用结果'foo'
  • 注意:iso8601格式的日期存在快速路径。

所以它告诉我们parse_dates=True只尝试解析索引。否则,您需要传递一个列位置列表,指示需要解析为日期的列。

您可能希望使用converters字典来明确处理这些列 请考虑以下df

df = pd.DataFrame(dict(
        A=pd.to_datetime(['2017-01-01']),
        B=pd.to_timedelta([37], unit='s')
    ))

将其写入文件

df.to_csv('test.csv', index=None)

定义converters字典

converters = dict(A=pd.to_datetime, B=pd.to_timedelta)
# in your case
# converters = dict(Duration=pd.to_timedelta)

阅读csv

df = pd.read_csv('test.csv', converters=converters)

df

           A        B
0 2017-01-01 00:00:37

df.dtypes

A     datetime64[ns]
B    timedelta64[ns]
dtype: object

答案 1 :(得分:3)

我认为您可以使用to_pickle然后使用read_pickle - docs

df.to_pickle('xyz.pkl')

df = pd.read_pickle('xyz.pkl')

但如果需要timedelta

import pandas as pd
import numpy as np
from pandas.compat import StringIO

temp=u"""Tasks|Duration
2017-04-18 08:11:39|PyMC3_Book|0 days 00:24:49.919194"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep="|", index_col=None, parse_dates=False)

print (df)
                          Tasks                Duration
2017-04-18 08:11:39  PyMC3_Book  0 days 00:24:49.919194

df.to_csv('xyz.csv')

df = pd.read_csv('xyz.csv', index_col=0, parse_dates=True)
df['Duration'] = pd.to_timedelta(df['Duration'])
print (df)
                          Tasks        Duration
2017-04-18 08:11:39  PyMC3_Book 00:24:49.919194

print (df.dtypes)
Tasks                object
Duration    timedelta64[ns]
dtype: object

print (df.index)

DatetimeIndex(['2017-04-18 08:11:39'], dtype='datetime64[ns]', freq=None)