【问题标题】:how to convert column dtypes for DateTime and Time in pandas如何在 pandas 中转换 DateTime 和 Time 的列 dtypes
【发布时间】:2021-05-06 09:07:52
【问题描述】:

我有一个数据框,其中包含具有时间和日期的列作为 objects dtypes

我想将列转换为 Time 和 DateTime dtypes

当我尝试转换它时,显示以下日期错误:

TypeError: 'Series' object is not callable

代码:

将熊猫导入为 pd

df=pd.DataFrame( {
    'time': ['22:00:00', 'nan', '00:45:00', 'nan'],
    'date': ['2020-09-30T00:00:00+03:00','0001-01-01T00:00:00+02:22','2020-10-01T00:00:00+03:00','0001-01-01T00:00:00+02:22']
     })            
df["date"]=df["date"].fillna("00/00/0000")
df["date"] = pd.to_datetime(df["date"],errors='coerce',format='%d%m%y')
                     
df["time"]=df["time"].fillna("00:00:00")
df["time"] = pd.to_timedelta(df["time"].str.strip())
        
print(df.info())

如何解决这个错误??

【问题讨论】:

  • 您的数据框似乎不起作用。时间列的长度大于日期列的长度。这应该会给你一个值错误ValueError: arrays must all be same length。空字符串也不是 na 值
  • @Horla.li 很抱歉这个错误我更正了它现在它的长度相同

标签: python pandas datetime


【解决方案1】:

代码有几个问题:

  • 创建数据框时,日期列的值比时间列少一个
  • fillna 方法只会替换 Null(或 nan)值而不是空字符串
  • “00/00/0000”不是 python 日期时间的有效日期
  • 您的日期格式略有偏差,您缺少分隔字段的 /,我相信您的日期是前一个月的(请参阅“2020 年 9 月 30 日”)

这里有一个修复这些错误的建议:

import pandas as pd

df = pd.DataFrame(
    {
        "time": ["10:00:00 PM", None, "12:45:00 AM", None, "1:00:00 AM"],
        "date": ["9/30/2020", "10/1/2020", None, "10/1/2020", None],
    }
)
df["date"] = df["date"].fillna("01/01/1970")
df["date"] = pd.to_datetime(df["date"], errors="coerce", format="%m/%d/%Y")

df["time"] = df["time"].fillna("00:00:00")
df["time"] = pd.to_timedelta(df["time"].str.strip())

print(df.info())

这段代码运行,最终的df没有空值。

【讨论】:

  • 我可以用预定义值之前的值填充 nan 值吗?比如:“10:00:00 PM”、“10:00:00 PM”
  • 是的。您需要指定填充方法来填充 fillna(method="pad")
  • 我将编辑我的问题并添加数据框作为其显示
【解决方案2】:

我不能 100% 确定您在寻找什么。

回答这个问题:
I want to convert the columns to Time and DateTime dtypes -- pandas 中没有像 Time 数据类型这样的东西。

我们能得到的最接近的是Timedeltadatetime 对象。

下面有一个选项可以获取time object

按要求填写时间。

df['date'] = pd.to_datetime(df.date, errors='coerce')
df['time'] = pd.to_datetime(df.time).dt.time.ffill()

输出

    time        date
0   22:00:00    2020-09-30 00:00:00+03:00
1   22:00:00    NaT
2   00:45:00    2020-10-01 00:00:00+03:00
3   00:45:00    NaT

第二个选项是 Timedelta

这有点烦人,因为它在开头添加了0 days
要仅从中提取时间,我们必须将其转换为字符串。(不确定这是否是要求)

df['time'] = pd.to_timedelta(df.time).ffill().astype(str).str.split().str[-1]

输出

    time        date
0   22:00:00    2020-09-30 00:00:00+03:00
1   22:00:00    NaT
2   00:45:00    2020-10-01 00:00:00+03:00
3   00:45:00    NaT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 2015-01-02
    相关资源
    最近更新 更多