2017-03-02 36 views
2

我有一個數據幀尋找這樣Python的大熊貓:轉換<類的元組'>爲datetime

  Sigma  JulianDay 
0  -9.05 2.451545e+06 
1  -10.99 2.451545e+06 
2  -8.42 2.451546e+06 
3  -8.92 2.451547e+06 
4  -10.79 2.451547e+06 
5  -9.53 2.451548e+06 

我想列「儒略日」轉換成公曆日期。對於這一點,我用了jdcal 1.3 package與已經定義的函數jd_to_date(JD)

d = df['JulianDay'].apply(jd_to_date) 
df['GregDate'] = d 

,其結果是:

 Sigma  JulianDay  GregDate 
0  -9.05 2.451545e+06 (2000, 1, 1) 
1  -10.99 2.451545e+06 (2000, 1, 1) 
2  -8.42 2.451546e+06 (2000, 1, 2) 
3  -8.92 2.451547e+06 (2000, 1, 3) 
4  -10.79 2.451547e+06 (2000, 1, 3) 
5  -9.53 2.451548e+06 (2000, 1, 4) 

輸出還告訴我,我處理的對象類型:

Name: JulianDay, dtype: object 

我的問題是,現在,我想的GregDate列轉換爲datetime,讓我能夠設置GregDate爲指標。但D型:試圖

df['GregDate'] = pd.to_datetime(d) 

當對象給我麻煩我得到的錯誤:

TypeError: <class 'tuple'> is not convertible to datetime 

所以,我怎麼第一「元組」列轉換爲別的東西,讓我能夠將其轉換爲日期時間?

感謝

回答

4

您可以constructor創造新DataFrame,然後應用to_datetime,重要的是列名yearmonthday

a = pd.DataFrame(df['GregDate'].values.tolist(), columns=['year','month','day']) 
print (a) 
    year month day 
0 2000  1 1 
1 2000  1 1 
2 2000  1 2 
3 2000  1 3 
4 2000  1 3 
5 2000  1 4 

df.GregDate = pd.to_datetime(a) 
print (df) 
    Sigma JulianDay GregDate 
0 -9.05 2451545.0 2000-01-01 
1 -10.99 2451545.0 2000-01-01 
2 -8.42 2451546.0 2000-01-02 
3 -8.92 2451547.0 2000-01-03 
4 -10.79 2451547.0 2000-01-03 
5 -9.53 2451548.0 2000-01-04 
+0

如果m y或其他答案是有幫助的,不要忘記[接受](http://meta.stackexchange.com/a/5235/295067)它。謝謝。 – jezrael

+0

謝謝,這完全解決了它。我試圖把它轉換成字典(它沒有正常工作),但與「values.tolist」它正是我想要的 – user7448207

+0

是的,它真的很快。祝你好運,美好的一天! – jezrael

0

或者,如果你不想創建另一個數據幀你可以使用以下內容

di = {} 
di['GregDate'] = [(2000,1,1), (2000,1,2), (2000,1,3)] 
df = pd.DataFrame(di) 
df.head() 

     # GregDate 
# 0 (2000, 1, 1) 
# 1 (2000, 1, 2) 
# 2 (2000, 1, 3) 

import datetime 
def to_dt(tpl): 
    tpl_dt = datetime.datetime.strptime('-'.join(str(x) for x in tpl), '%Y-%m-%d').strftime('%Y-%m-%d') 
    return tpl_dt 

df.loc[:, 'GregDate'] = df.GregDate.apply(func = to_dt) 
df.head() 
    # GregDate 
# 0 2000-01-01 
# 1 2000-01-02 
# 2 2000-01-03