2016-09-24 68 views
1

这种结构荷载与熊猫一个数据帧(从CSV)后生成2个日期时间列,比如'startdate'和'enddate'。由于缺少需要处理的值,因此read_csv中的parse_dates & date_parser参数看起来有点笨拙,所以我编写了下面的函数。建设日期时间

首先,我填写NaN值,以便将月份和日期从浮点数转换为整数,然后将它们串在一起进行解析。

def dateparser(y=df.startyear,m=df.startmonth,d=df.startday): 
    m = m.fillna(1).astype(int) 
    d = d.fillna(1).astype(int) 
    x = str(y) + " " + str(m) + " " + str(d) 
    return pd.datetime.strptime(x, '%Y %m %d') 

所得错误消息是有点混乱,因为字符串格式应该是什么strptime预期完全一致。

n [338]: dateparser() 
Traceback (most recent call last): 

    File "<ipython-input-338-917257f547ca>", line 1, in <module> 
    dateparser() 

    File "<ipython-input-337-41aa89124ae6>", line 5, in dateparser 
    return pd.datetime.strptime(x, '%Y %m %d') 

    File "/Users/Username/anaconda/lib/python3.5/_strptime.py", line 510, in _strptime_datetime 
    tt, fraction = _strptime(data_string, format) 

    File "/Users/Username/anaconda/lib/python3.5/_strptime.py", line 343, in _strptime 
    (data_string, format)) 

    ValueError: time data 'caseid\n1945121601 1945\n1946031101  
1946\n1946110101 1946\n1947022401 1947\n1947053101 
     1947\n1947111001 1947\n1947120501 1947\n1947120502  
1947\n1947120503 1947\n1947120504 1947\n1947120505  
1947\n1947120506 1947\n1947120507 1947\n1947122001  
1947\n1948032501 1948\n1948032502 1948\n1948070101  
6\n2005100601 10\n 

    Name: startmonth, dtype: int64 caseid\n1945121601 16\n1946031101  
6\nName: startday, dtype: int64' does not match format '%Y %m %d'` 

我也试过其他分析软件包,打开大部分的时间字符串在英语为日期时间变量的没有问题:

from dateutil.parser import parse 
def dateparser(): 
    (same function as above) 
    return parse(x) 

而且这也导致错误(ValueError异常:未知字符串格式)。 ..

任何想法如何改善功能非常感谢。对我而言,大多数包函数只是将字符串转换为日期时间,并且需要将整数/浮点数转换为字符串,即使它不应该很难直接将数字数据转换为日期时间格式也是有点奇怪的。错过一些明显的解

+1

放了'''试着在违规线/ except'''块,赶上'''ValueError''',在'''except'''套件打印出来的函数参数和您的日期字符串 - '''x'''。这应该让你知道发生了什么。如果你希望它在那个点停止,请重新提出'''except''套件中的错误.https://docs.python.org/3/tutorial/errors.html#handling-exceptions – wwii

+0

非常感谢如何调试这个提示!我已成功找到问题并将在下面回答以供参考。 –

回答

0

虽然不是绝对确定,但问题似乎是我试图为解析器提供一个pandas Series,而他们只希望采用字符串。

在这个cae中,熊猫自己的to_datetime函数可以完成这项工作。

def dateparser(y=t4.startyear,m=t4.startmonth,d=t4.startday): 
    y = y.astype(str)  
    m = m.fillna(1).astype(int).astype(str) 
    d = d.fillna(1).astype(int).astype(str) 
    x = y +' '+ m +' '+ d 
    return pd.to_datetime(x) 
相关问题