【发布时间】:2017-02-02 07:08:31
【问题描述】:
使用 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 个日期时间列,例如“开始日期”和“结束日期”。由于有缺失值需要处理,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: Unknown string format)...
非常感谢任何有关如何改进功能的想法。对我来说也有点奇怪的是,大多数包函数只将字符串转换为日期时间,并且需要将整数/浮点数转换为字符串,即使直接将数值数据转换为日期时间格式应该不难......我是不是错过一些明显的解决方案?
【问题讨论】:
-
在违规行周围放置一个
try/except块并捕获ValueError,在except套件中打印出函数参数和您的日期字符串-x。这应该让您了解正在发生的事情。如果您希望它在该点停止,请重新引发except套件中的错误。docs.python.org/3/tutorial/errors.html#handling-exceptions -
非常感谢有关如何调试的提示!我已成功找到问题,将在下面回答以供参考。
标签: python string datetime pandas