从pandas中的3个整数/浮点列构建日期时间

时间:2016-09-24 14:26:54

标签: python string datetime pandas

用Panda(来自csv)加载带有这种结构的DataFrame:

            startmonth  startday  startyear  endmonth  endday  endyear  
caseid                                                                   
1945121601        12.0      16.0       1945       5.0    27.0   1947.0   
1946031101         3.0      11.0       1946      10.0     9.0   1993.0   
1946110101        11.0       1.0       1946       2.0     4.0   1947.0   

我正在考虑如何有效地使用前3&最后3列生成2个日期时间列,比如'startdate'和'enddate'。由于存在需要处理的缺失值,因此parse_dates& read_csv中的date_parser参数看起来有点笨拙,所以我编写了下面的函数。

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

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'`

我还尝试了另一个解析包,它将英语中的大部分日期时间字符串转换为datetime变量而没有问题:

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

它也会导致错误(ValueError:未知的字符串格式)......

非常感谢任何有关如何改进功能的想法。对我来说有点奇怪的是,大多数包函数只将字符串转换为日期时间,并且需要将整数/浮点数转换为字符串,即使它不应该很难将数值数据直接转换为日期时间格式...我做了吗想念一些明显的解决方案?

1 个答案:

答案 0 :(得分:0)

虽然不是很确定,但问题似乎是我试图为解析器提供一个pandas系列,而他们只希望获取字符串。

在这个cae中,Panda自己的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)