将str序列转换为日期

2024-05-23 22:36:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在恶梦般地把一系列字符串转换成日期。这是我的数据样本:

net_due_date                from_date   clearing_date
0   2018-10-25 00:00:00.000 2017-06-06  2018-10-13 00:00:00.000
1   2018-09-27 00:00:00.000 2017-06-06  2018-09-30 00:00:00.000
2   2018-05-31 00:00:00.000 2017-06-06  2018-05-18 00:00:00.000
3   2017-12-22 00:00:00.000 2017-06-06  2017-12-08 00:00:00.000
4   2018-01-30 00:00:00.000 2017-06-06  2018-01-16 00:00:00.000
5   2018-07-31 00:00:00.000 2017-06-06  2018-07-31 00:00:00.000
6   2018-05-29 00:00:00.000 2017-06-06  2018-05-17 00:00:00.000
7   2017-12-14 00:00:00.000 2017-06-06  2017-12-08 00:00:00.000
8   2017-11-24 00:00:00.000 2017-06-06  2017-12-08 00:00:00.000
9   2018-09-27 00:00:00.000 2017-06-06  2018-09-13 00:00:00.000
10  2018-01-25 00:00:00.000 2017-06-06  2018-01-16 00:00:00.000
11  2017-11-24 00:00:00.000 2017-06-06  2017-11-30 00:00:00.000
12  2018-10-24 00:00:00.000 2018-01-09  2018-10-11 00:00:00.000
13  2018-01-22 00:00:00.000 2018-01-09  2018-10-10 00:00:00.000
14  2018-09-06 00:00:00.000 2018-01-09  2018-10-10 00:00:00.000
15  2018-10-24 00:00:00.000 2018-01-09  2018-10-10 00:00:00.000
16  2018-06-15 00:00:00.000 2018-01-09  2018-10-10 00:00:00.000
17  2018-04-10 00:00:00.000 2018-01-09  2018-10-10 00:00:00.000
18  2018-01-12 00:00:00.000 2018-01-09  2018-10-10 00:00:00.000
19  2018-01-24 00:00:00.000 2018-01-09  2018-10-10 00:00:00.000

以下是数据类型:

net_due_date     object
from_date        object
clearing_date    object
dtype: object

我正在尝试将所有这些数据转换为相同的格式,以便可以对其运行函数来计算日期之间的差异。你知道吗

以下代码在净到期日正常工作:

df['net_due_date'] = pd.to_datetime(df['net_due_date'], format='%Y-%m-%d')

而且类似的代码从\u日期起就可以正常工作:

df['from_date'] = pd.to_datetime(df['from_date'], format='%Y-%m-%d')

但是,清除日期中的某些值为9999-12-31,当我运行相同的代码时,会出现以下错误:

OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 9999-12-31 00:00:00

我花了好几个小时试图解决这个问题,最近的一个链接是: Time Series, OOB Timestamps

但是我遇到了以下错误:

TypeError: unsupported operand type(s) for //: 'str' and 'int'

为了解决这个问题,我尝试先使用To\ numeric将列转换为int,但又出现了一系列错误。我希望有人已经在这个问题之前,可以帮助,因为我找不到任何在线解决这个问题!你知道吗


Tags: to数据代码fromformatdfdatetimedate
2条回答

您可以使用相同方法的^{} argument

errors : {‘ignore’, ‘raise’, ‘coerce’}, default ‘raise’

  • If ‘raise’, then invalid parsing will raise an exception

  • If ‘coerce’, then invalid parsing will be set as NaT

  • If ‘ignore’, then invalid parsing will return the input

这一行应该能帮到你:

df = df.apply(lambda x: pd.to_datetime(x, errors='coerce'))

# results:
#    net_due_date  from_date  clearing_date
# ...
# 10   2018-01-25 2017-06-06     2018-01-16
# 11   2017-11-24 2017-06-06            NaT
# 12   2018-10-24 2018-01-09     2018-10-11
# ...

如有必要,您可以在DataFrame之后对NaT值进行按摩,并转换为对您有意义的内容,例如:

df.fillna(pd.datetime.now().date(), inplace=True)

#    net_due_date  from_date  clearing_date    
# 10   2018-01-25 2017-06-06     2018-01-16
# 11   2017-11-24 2017-06-06     2018-11-23 # <  changed to today
# 12   2018-10-24 2018-01-09     2018-10-11

为了确认dtypes

net_due_date      datetime64[ns]
 from_date        datetime64[ns]
 clearing_date    datetime64[ns]
dtype: object

我假设在您的例子中,所有列都是String类型,并且包含日期 +有时,有时,有时。所以最简单的选择是:

df = df.applymap(pd.to_datetime)

运行以下脚本转换部分源数据:

import pandas as pd

dd = { 'net_due_date': [ '2018-10-25 00:00:00.000', '2018-09-27 00:00:00.000',
        '2018-05-31 00:00:00.000', '2017-12-22 00:00:00.000',
        '2018-01-30 00:00:00.000' ],
    'from_date': [ '2017-06-06', '2017-06-06', '2017-06-06', '2017-06-06', '2017-06-06' ],
    'clearing_date': [ '2018-10-13 00:00:00.000', '2018-09-30 00:00:00.000',
        '2018-05-18 00:00:00.000', '2017-12-08 00:00:00.000', '2018-01-16 00:00:00.000' ] }
df = pd.DataFrame(data=dd)
df = df.applymap(pd.to_datetime)

当您执行df.info()时,您将得到(打印输出的一部分):

Data columns (total 3 columns):
net_due_date     5 non-null datetime64[ns]
from_date        5 non-null datetime64[ns]
clearing_date    5 non-null datetime64[ns]

为了演示,您可以在前面和后面添加print(df) 转换。你知道吗

就“非常大”的年份而言,熊猫会用 年份在1677年到2262年之间。所以作为第一步 您应该将这些超出范围的日期更改为例如2250。你知道吗

相关问题 更多 >