2017-04-19 38 views
2

我有一個帶有日期時間對象的熊貓數據框(包括timedelta)。當我創建DF時,一切都很好,但是當我將其導出到csv並再次導入時,日期時間對象是字符串。當我導出到csv時,寬鬆的timedelta格式 - 有沒有解決方案?

我嘗試導入時以及

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

導出時使用

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

。但它不起作用。

上下文: 我創建了一個生成數據的程序,將它放入一個熊貓DF中,並且這些DF必須存儲,直到下一次打開該程序。

所以我的問題是:是否有可能用CSV.format做到這一點?一般來說,輸出熊貓DF的最佳格式是什麼,以儘可能多地保留它們的屬性? 謝謝!

編輯:

數據樣本: 這是在DF的行(索引爲datetime對象)。這些列是'任務'(這是字符串格式)和'持續時間'(這是timedelta對象)。

2017年4月18日08:11:39 | PyMC3_Book |0天00:24:49.919194

+0

你可以添加數據樣本? – jezrael

+0

我編輯了該數據框的一行。讓我知道你是否需要更多信息。謝謝 – Jaynes01

回答

2

我認爲你可以使用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) 
+1

'pickle'將起作用。 – piRSquared

+0

鹹菜工作。謝謝你們倆。 – Jaynes01

3

這不是如何read_csv小號parse_dates參數工作

From the Docs

  • parse_dates布爾或整數或名稱或列表或字典的名單列表,默認爲false
    • 布爾值。如果爲True - >嘗試解析索引。
    • 整數或名稱的列表。例如如果[1,2,3] - >嘗試解析每個列作爲單獨的日期列。
    • 列表的列表。例如如果[[1,3]] - >將第1列和第3列組合起來並將其解析爲 單個日期列。
    • 字典,例如{'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

是的,但我認爲timedelta存在主要問題。 – jezrael

+0

嗯,好吧...我在想 – piRSquared

+1

@jezrael轉換器將工作 – piRSquared

相關問題