2014-11-10 2 views
2

일부 날짜가있는 팬더 DataFrame을 json에 저장 한 다음 다시 읽으려고합니다. json에서 다시 읽으면서 날짜가 다른 형식으로 바뀌었지만 (대부분의 경우이 날짜를 다시 구문 분석해야 함)팬더가 json에 DataFrame 저장 및 읽기

import pandas as pd 
df = pd.Series(range(7),pd.date_range('2014-10-01','2014-10-07')).reset_index() 
df.columns = ['LoadDate','number'] 
print df 

    LoadDate number 
0 2014-10-01  0 
1 2014-10-02  1 
2 2014-10-03  2 
3 2014-10-04  3 
4 2014-10-05  4 
5 2014-10-06  5 
6 2014-10-07  6 

지금, 수출과 다시 읽고 내가 (원치 않는) 다음과 같은 결과를 얻을 수있어 경우

print pd.read_json(df.to_json()) 

     LoadDate number 
0 1412121600000  0 
1 1412208000000  1 
2 1412294400000  2 
3 1412380800000  3 
4 1412467200000  4 
5 1412553600000  5 
6 1412640000000  6 

난에서 날짜를 다시 읽을 수 있도록하고 싶습니다 원래 형식. 나는 이것을 어떻게 깨끗한 방법으로 할 수 있는가?

여기 재미있는 부분이 있습니다.

df.columns = ['date','number'] 
print pd.read_json(df.to_json()) 

     date number 
0 2014-10-01  0 
1 2014-10-02  1 
2 2014-10-03  2 
3 2014-10-04  3 
4 2014-10-05  4 
5 2014-10-06  5 
6 2014-10-07  6 

열의 이름을 "날짜"로 변경하면 작동합니다. 물론, 저는 칼럼을 날짜와 다른 것으로 부를 수 있기를 바랍니다. 그래서 나는 이것을 어떻게 관리 할 수 ​​있는지 알아 내는데 여전히 관심이 있습니다. 많은 감사합니다! (저는 팬더 0.15.0을 사용하고 있습니다!)

답변

4

우선 to_json을 사용할 때이 번호를 얻는 이유. docstring는 "날짜 개체가 UNIX 타임 스탬프로 변환됩니다"라고 말한다 :

In [27]: df.to_json() 
Out[27]: '{"LoadDate":{"0":1412121600000,"1":1412208000000,...}}' 

그래서 당신이 볼 숫자가 유닉스 시대의 타임 스탬프입니다. read_json 구문 분석하는 이유

In [19]: df.to_json(date_format='iso') 
Out[19]: '{"LoadDate":{"0":"2014-10-01T00:00:00.000Z","1":"2014-10-02T00:00:00.000Z", ...}}' 

그런 다음, 둘째, 다른 :하지만 당신은 또한 출력 ISO 형식의 문자열을 지정할 수 있습니다 to_jsondate_format 인수가 있습니다. 다시, docstring에서 :

convert_dates : Boolean true로 기본 날짜를 구문 분석하는 열
목록; True라면, datelike 컬럼을 파싱하려고 시도한다. 기본값은 True이다.

이것은 기본적으로 참이므로 datelike 컬럼을 탐지하려고 시도 할 것이다. Apparantly,이 감지는 또한 열 이름을 찾습니다. 그러나 docstring이 말하듯이 날짜로 해석 할 열을 수동으로 지정할 수도 있습니다.

In [25]: pd.read_json(df.to_json(), convert_dates=['LoadDate']) 
Out[25]: 
    LoadDate number 
0 2014-10-01  0 
1 2014-10-02  1 
2 2014-10-03  2 
3 2014-10-04  3 
4 2014-10-05  4 
5 2014-10-06  5 
6 2014-10-07  6 
+0

많은 감사합니다. joris - 이것으로 대부분 설명합니다 !! 불행히도 내 경우에는 날짜로 변환해야하는 열을 지정할 수 없습니다 (위의 단순화 문제입니다). 그리고 LoadDate는 원래 datetime64 [ns] 였으므로 json에서 다시 읽을 때이 옵션을 선택해야합니다. pandas.DataFrame.to_csv()를 사용한 다음 pandas.DataFrame.from_csv()를 사용하여 동일한 날짜 사양으로 pandas 데이터 프레임을 저장하고로드 할 수 있습니다. JSON에서 동일한 작업을 수행하고 싶습니다. 어떤 아이디어? –

+0

마지막 예제에서 열은 datetime64로 되돌아 왔습니다. 그러나'read_csv'에서도 날짜로 해석 할 열을 지정해야합니다 (parse_dates 매개 변수 [http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv]). .html)), 그래서 나는이 계정에 차이가 있다고 생각하지 않습니까? – joris

+0

당신 말이 맞습니다. 차이는 없습니다. 나는 그것을했다 - 모두를위한 많은 감사! :디 –