我有一个带有日期时间对象的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
答案 0 :(得分:4)
这不是read_csv
parse_dates
参数的工作原理
所以它告诉我们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)