【问题标题】:Create dataframe and set column as datetime?创建数据框并将列设置为日期时间?
【发布时间】:2021-08-18 18:59:43
【问题描述】:

我想创建一个 pandas 数据框 df,例如:

df = pd.DataFrame(
    {
        "group": ["A", "A", "A", "A", "A"],
        "date": ["2020-01-02", "2020-01-13", "2020-02-01", "2020-02-23", "2020-03-05"],
        "value": [10, 20, 16, 31, 56],
    }
)

我想在创建数据框时将“日期”列指定为 dtype=datetime64[ns],而不是之后。

所以不是这样的:

df = pd.DataFrame(
    {
        "group": ["A", "A", "A", "A", "A"],
        "date": ["2020-01-02", "2020-01-13", "2020-02-01", "2020-02-23", "2020-03-05"],
        "value": [10, 20, 16, 31, 56],
    }
)
df["date"] = pd.to_datetime(df["date"])

但是像这样:

df = pd.DataFrame(
    {
        "group": ["A", "A", "A", "A", "A"],
        "date": pd.Series(
            ["2020-01-02", "2020-01-13", "2020-02-01", "2020-02-23", "2020-03-05"],
            dtype=np.datetime64,
        ),
        "value": [10, 20, 16, 31, 56],
    }
)

但这给出了错误:

ValueError: 'datetime64' dtype 没有单位。请改为传入 'datetime64[ns]'。

这样做

df = pd.DataFrame(
    {
        "group": ["A", "A", "A", "A", "A"],
        "date": pd.Series(
            ["2020-01-02", "2020-01-13", "2020-02-01", "2020-02-23", "2020-03-05"],
            dtype=np.datetime64[ns],
        ),
        "value": [10, 20, 16, 31, 56],
    }
) 

我收到此错误:

NameError: 名称“ns”未定义

那么如何将特定列设置为“datetime64[ns]”类型?

【问题讨论】:

  • np.datetime64 更改为'datetime64[ns]'

标签: python pandas datetime


【解决方案1】:

你可以在dict中使用pd.to_datetime,如下:

df = pd.DataFrame(
    {
        "group": ["A", "A", "A", "A", "A"],
        "date": pd.to_datetime(["2020-01-02", "2020-01-13", "2020-02-01", "2020-02-23", "2020-03-05"]),
        "value": [10, 20, 16, 31, 56],
    }
)

date 列采用datetime64[ns] 格式,您可以通过df.info() 看到

df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   group   5 non-null      object        
 1   date    5 non-null      datetime64[ns]
 2   value   5 non-null      int64         
dtypes: datetime64[ns](1), int64(1), object(1)
memory usage: 248.0+ bytes

【讨论】:

  • OP需要So how can I set a specific column as type "datetime64[ns]"?
  • @jezrael 创建的列是 dtype datetime64[ns],从 df.info() 可以看出。这不是我想念的吗?
  • @jezrael 我的解释是,只要最终结果获得所需的 dtype 就可以了,而不是我们需要一个步骤来设置 dtype在此过程中。有时很难猜测 OP 想要什么。总之谢谢你的提醒。祝你有美好的一天:-)
  • 是的,我认为 to_datetime 是这里最好的解决方案,不幸的是,只有 OP 需要其他东西。
【解决方案2】:

使用dtype='datetime64[ns]':

df=pd.DataFrame(
    {
        "group": ["A", "A", "A", "A", "A"],
        "date": pd.Series(
            ["2020-01-02", "2020-01-13", "2020-02-01", "2020-02-23", "2020-03-05"],
            dtype='datetime64[ns]',
        ),
        "value": [10, 20, 16, 31, 56],
    }
)

使用astype():

df = pd.DataFrame(
    {
        "group": ["A", "A", "A", "A", "A"],
        "date": ["2020-01-02", "2020-01-13", "2020-02-01", "2020-02-23", "2020-03-05"],
        "value": [10, 20, 16, 31, 56],
    }
)
df['date']=df['date'].astype("Datetime64")

通过pd.Timestamp():

df = pd.DataFrame(
    {
        "group": ["A", "A", "A", "A", "A"],
        "date": list(map(pd.Timestamp,["2020-01-02", "2020-01-13", "2020-02-01", "2020-02-23", "2020-03-05"])),
        "value": [10, 20, 16, 31, 56],
    }
)

【讨论】:

    【解决方案3】:

    我不知道为什么在创建数据框后转换日期会出现问题?您可以将 df 创建与 astype 链接起来:

    df = pd.DataFrame(
        {"group": ["A", "A", "A", "A", "A"],
         "date": ["2020-01-02", "2020-01-13", "2020-02-01", "2020-02-23", "2020-03-05"],
         "value": [10, 20, 16, 31, 56],
        }).astype({'date': 'datetime64'})
    
    >>> df.info()
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 5 entries, 0 to 4
    Data columns (total 3 columns):
     #   Column  Non-Null Count  Dtype
    ---  ------  --------------  -----
     0   group   5 non-null      object
     1   date    5 non-null      datetime64[ns]
     2   value   5 non-null      int64
    dtypes: datetime64[ns](1), int64(1), object(1)
    memory usage: 248.0+ bytes
    

    【讨论】:

    • 在创建最小可行示例时,直接在数据框创建中设置所有内容并消除混乱通常是有益的(至少对我而言)。不知道我可以将 .astype() 与 dict 输入一起使用,这会派上用场,谢谢。
    • 我认为astype 比在数据框或嵌套系列中应用函数更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2016-02-18
    • 2021-01-15
    • 2021-08-06
    • 2013-11-29
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多