【问题标题】:Date of YYYYMMDDHHMMSS in pandas data framepandas 数据框中 YYYYMMDDHHMMSS 的日期
【发布时间】:2021-09-26 16:33:08
【问题描述】:

我的数据框包含一个 IGN_DATE 列,其中值的格式为 20080727142700,格式为 YYYYMMDDHHMMSS。 列类型为 float64。

如何获得时间、日期(不含 00:00:00)、日、月的单独列。

我尝试了什么:

列名IGN_DATE 数据框 - df

df['IGN_DATE'] = df['IGN_DATE'].apply(str)

df['DATE'] = pd.to_datetime(df['IGN_DATE'].str.slice(start = 0, stop = 8))
df['MONTH'] = df['IGN_DATE'].str.slice(start = 4, stop = 6).astype(int)
df['DAY'] = df['IGN_DATE'].str.slice(start = 6, stop = 8).astype(int)
df['TIME'] = df['IGN_DATE'].str.slice(start = 8, stop = 13)

  1. DATE 的格式为 YYYY-MM-DD 00:00:00。我不希望 DATE 是 00:00:00。
  2. 如何将时间(字符串类型)转换为 HH:MM:SS?
  3. 有没有更简单的方法来做到这一点?

【问题讨论】:

    标签: python pandas string dataframe python-datetime


    【解决方案1】:

    如果nan 的值不重要,那么dropna 可以将to_datetime 转换为指定格式,然后使用dt accessor 访问所需的值:

    # Drop Rows with nan in IGN_DATE column
    df = df.dropna(subset=['IGN_DATE'])
    # Convert dtype to whole number then to `str`
    df['IGN_DATE'] = df['IGN_DATE'].astype('int64').astype(str)
    # Series of datetime values from Column
    s = pd.to_datetime(df['IGN_DATE'], format='%Y%m%d%H%M%S')
    # Extract out and add to DataFrame from `s`
    df['DATE'] = s.dt.date
    df['MONTH'] = s.dt.month
    df['DAY'] = s.dt.day
    df['TIME'] = s.dt.time
    

    否则可以从IGN_DATE 中屏蔽notna 值并仅分配这些行:

    # Mask not null values
    m = df['IGN_DATE'].notna()
    # Convert to String
    df.loc[m, 'IGN_DATE'] = df.loc[m, 'IGN_DATE'].astype('int64').astype(str)
    # Series of datetime values from Column
    s = pd.to_datetime(df['IGN_DATE'], format='%Y%m%d%H%M%S')
    # Extract out and add to DataFrame from `s`
    df.loc[m, 'DATE'] = s.dt.date
    df.loc[m, 'MONTH'] = s.dt.month
    df.loc[m, 'DAY'] = s.dt.day
    df.loc[m, 'TIME'] = s.dt.time
    

    样本 DF:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({'IGN_DATE': [20080727142700, np.nan, 20151015171807]})
    

    dropna 的示例输出:

             IGN_DATE        DATE  MONTH  DAY      TIME
    0  20080727142700  2008-07-27      7   27  14:27:00
    2  20151015171807  2015-10-15     10   15  17:18:07
    

    带掩码的示例输出:

             IGN_DATE        DATE  MONTH   DAY      TIME
    0  20080727142700  2008-07-27    7.0  27.0  14:27:00
    1             NaN         NaN    NaN   NaN       NaN
    2  20151015171807  2015-10-15   10.0  15.0  17:18:07
    

    【讨论】:

    • 当我将数据转换为字符串时,它会将 20080727142700 更改为 20080727142700.0 。所以我在转换为字符串之前使用了mask = pd.to_numeric(df['IGN_DATE']).notnull() df['IGN_DATE'].loc[mask] = df['IGN_DATE'].loc[mask].astype(np.int64)。但是,我收到警告:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
    • 另外,我的数据有两个值,分别是 YYYYMMDDHHMMSS 和 YYYYMMDD。我正在使用 for 循环:for row in df.columns: if (row['IGN_DATE'] > 1000000000): 但是这个 if 语句不起作用。我什至尝试使用if ( row['IGN_DATE'].str.len() > 10)。我收到与 if 语句相关的错误。知道如何处理这种情况。
    • 听起来你在列中有NaN 值,这使得数据类型float 不是int。我已经更新了我的答案以包括处理这个案例。然而,如何处理多种不同的格式类型实际上听起来像 new question 关于如何解析具有多种不同日期格式的列。
    • 你是对的。它确实有我在开始时使用 thisdf.dropna(subset = ["IGN_DATE"], inplace=True) 删除的 nan 值。谢谢,我会问一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 2012-12-01
    • 2019-11-10
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多