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