【问题标题】:Pandas: Read dates in column which has different formats熊猫:读取具有不同格式的列中的日期
【发布时间】:2021-06-28 21:34:45
【问题描述】:

我想读取 csv,列中有日期,但列中的日期格式不同。

具体来说,有些日期是“dd/mm/yyyy”格式,有些是“4####”格式(excel 1900日期系统,序列号表示自1900/1/1以来经过的天数)。

有没有办法使用read_csvpandas.to_datetime 将列转换为日期时间?

尝试使用pandas.to_datetime不带参数无济于事。

df["Date"] = pd.to_datetime(df["Date"])

返回

ValueError: year 42613 is out of range

大概它可以很好地读取“dd/mm/yyyy”格式,但会产生“4####”格式的错误。

注意:该列也是混合类型

感谢任何帮助

例子

dates = ['25/07/2016', '42315'] 
df = DataFrame (dates, columns=['Date'])
#desired output ['25/07/2016', '07/11/2015']

【问题讨论】:

  • 您能否包含一个示例框架作为可复制的代码片段,以及用于测试解决方案的预期输出?
  • 谢谢,添加示例输入/输出
  • 42315 的日期格式是什么423 代表什么?我假设15 是两位数的年份。
  • 嗨亨利,日期格式是 2015-11-07 在 excel 1900 日期系统下的日期表示,序列号表示自 1900/1/1 以来经过的天数。 IE。如果将 42315 作为数字输入到 excel 中并将格式更改为日期,它将返回 2015-11-07。
  • @jeremyw,您能否将数据集拆分为两个不同的数据帧:每个数据帧中的一种日期类型?例如。将带有日期的列转换为字符串并选择那些有“/”符号的,哪些没有。在这一步之后,您可以以不同的方式处理这些日期或统一它们的格式。

标签: pandas datetime


【解决方案1】:

我们试试吧:

dates = pd.to_datetime(df['Date'], dayfirst=True, errors='coerce')
m = dates.isna()
dates.loc[m] = (
        pd.TimedeltaIndex(df.loc[m, 'Date'].astype(int), unit='d')
        + pd.Timestamp(year=1899, month=12, day=30)
)
df['Date'] = dates

或者秒转换:

dates = pd.to_datetime(df['Date'], dayfirst=True, errors='coerce')
m = dates.isna()
dates.loc[m] = pd.to_datetime(
    (df.loc[m, 'Date'].astype(int) - 25569) * 86400.0,
    unit='s'
)
df['Date'] = dates

df:

        Date
0 2016-07-25
1 2015-11-07

解释:

  1. 首先将pd.to_datetime 可以完成的所有操作都转换为日期时间:
dates = pd.to_datetime(df['Date'], dayfirst=True, errors='coerce')
  1. 检查哪些值无法转换:
m = dates.isna()
  1. 转换NaTs

一个。从1899-12-30 使用TimedeltaIndex + pd.Timestamp 后的天数偏移:

dates.loc[m] = (
        pd.TimedeltaIndex(df.loc[m, 'Date'].astype(int), unit='d')
        + pd.Timestamp(year=1899, month=12, day=30)
)

b.或者在数学上将连续天数转换为秒数:

dates.loc[m] = pd.to_datetime(
    (df.loc[m, 'Date'].astype(int) - 25569) * 86400.0,
    unit='s'
)
  1. 更新Date 列:
df['Date'] = dates

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 2017-01-06
    • 2019-05-09
    • 1970-01-01
    • 2015-10-21
    • 2014-02-23
    • 2021-02-12
    • 2019-07-19
    相关资源
    最近更新 更多