【问题标题】:building datetime from 3 integer/float columns in pandas从 Pandas 中的 3 个整数/浮点列构建日期时间
【发布时间】: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


【解决方案1】:

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

在这个 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)

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2018-09-16
    • 1970-01-01
    • 2019-05-30
    • 2021-01-30
    • 2014-11-26
    相关资源
    最近更新 更多