【问题标题】:Pandas, Datetime NaT Removal and replace with None, 'str' object has no attribute 'strftime'Pandas,Datetime NaT 删除并替换为 None,'str' 对象没有属性 'strftime'
【发布时间】:2020-04-07 20:33:24
【问题描述】:

我正在将我的日期从 yyyymmdd 转换为 yyyy-mm-dd hh:mm:ss 使用:

d7['date'] = pd.to_datetime(d7['date'], format='%Y%m%d', errors='coerce').dt.strftime('%Y-%m-%d %H:%M:%S.%f')

但我收到错误AttributeError: 'str' object has no attribute 'strftime'

我已经尝试实现这个Remove dtype datetime NaT,但很难将它与我上面的格式结合起来。

在我的日期列中会得到 2028-01-31 00:00:00.000000NaT 这样的日期,我想将 NaT 设为空白或 None

示例数据框:

2019-11-01 00:00:00.000000

2019-11-01 00:00:00.000000

2019-11-01 00:00:00.000000

2019-11-04 00:00:00.000000

2019-11-01 00:00:00.000000

2019-11-01 00:00:00.000000

2019-11-01 00:00:00.000000

2019-11-01 00:00:00.000000

2019-11-01 00:00:00.000000

NaT

谢谢。

【问题讨论】:

  • "另外一个好处是删除我日期中的尾随 .0。"您正在使用.dt.strftime('%Y-%m-%d %H:%M:%S.%f')。删除.%f
  • "我正在将我的日期从 yyyymmdd 转换为 yyyy-mm-dd hh:mm:ss 使用:" 您刚刚发布的内容看起来不像 原始 数据.发布原始数据。
  • 感谢有关删除 .%f 的提示。我的整个 df 有很多列和行。你需要完整的数据框吗?我的第一个 NaT 直到第 30000 行才出现,所以我只是把它放了一些日期给你
  • 用None代替NaT的目的是什么?你想删除那些行吗?

标签: python pandas


【解决方案1】:
  • “我正在将我的日期从 yyyymmdd 转换为 yyyy-mm-dd hh:mm:ss”,因此 20180101 是初始日期格式的一个示例。
  • Remove dtype datetime NaT 需要日期时间格式,但 pd.to_datetime(d7['date'], format='%Y%m%d', errors='coerce').dt.strftime('%Y-%m-%d %H:%M:%S.%f') 创建一个字符串。
import pandas as pd

# sample data
df = pd.DataFrame({'date': ['20180101', '', '20190101']})

# df view
       date
0  20180101
1          
2  20190101

# convert to datetime format
df.date = pd.to_datetime(df.date, format='%Y%m%d', errors='coerce')

# df view
        date
0 2018-01-01
1        NaT
2 2019-01-01

# apply method from link
# use None if you want NoneType.  If you want a string, use 'None'
df.date = df.date.apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S') if not pd.isnull(x) else None)

# final output
                  date
0  2018-01-01 00:00:00
1                 None
2  2019-01-01 00:00:00

要查找问题行,请尝试以下代码。

  • 该函数将返回 strNone 或打印任何导致 AttributeError 的“日期”行
df = pd.DataFrame({'date': ['20180101', '', '20190101', 'abcd', 3456]})
df.date = pd.to_datetime(df.date, format='%Y%m%d', errors='coerce')

# convert from datetime format to string format
def convert(x) -> (str, None):
    try:
        return x.strftime('%Y-%m-%d %H:%M:%S') if not pd.isnull(x) else None
    except AttributeError:
        return None
        print(x)      

# apply the function
df.date = df.date.apply(lambda x: convert(x))

# output df
                  date
0  2018-01-01 00:00:00
1                 None
2  2019-01-01 00:00:00
3                 None
4                 None

【讨论】:

  • 嘿,特伦顿,我仍然遇到同样的错误。 str object has no attribute strftime
  • @excelguy 那么问题中未包含的数据可能有问题。如果你把数据贴在某个地方,我可以看看,否则我没有任何其他建议
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2016-06-26
  • 2017-08-06
  • 2015-09-11
  • 2020-06-25
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多