【问题标题】:Unable to convert a column to datetime无法将列转换为日期时间
【发布时间】:2019-09-22 21:34:11
【问题描述】:

我从这里尝试了很多建议,但都没有解决。 我有两列这样的观察:15:08:19

如果我写

df.time_entry.describe() 

它出现了:

count       814262
unique       56765
top       15:03:00
freq           103
Name: time_entry, dtype: object

我已经运行了这段代码:

df['time_entry'] = pd.to_datetime(df['time_entry'],format= '%H:%M:%S', errors='ignore' ).dt.time

但重新运行描述代码仍然返回dtype: object

【问题讨论】:

  • 它是否适用于errors='coerce'?我认为忽略一条坏线会迫使它返回输入。
  • 也许这会有所帮助:pandas-convert-strings-to-time-without-date
  • coerce 选项不起作用。 ://
  • 这个链接提出的问题多于答案。
  • 问题是我需要减去两列才能看到它们之间花费的时间。使用 object 作为 dtype 我不能这样做。 Ed Chum 的回答对我来说完全没用。

标签: python pandas datetime-format


【解决方案1】:

问题是您正在使用具有属性time 的日期时间访问器(.dt),然后您无法将两列相减。因此,只需省略 .dt.time 即可。

这是一些包含 2 列字符串的数据

df = pd.DataFrame()
df['time_entry'] = ['12:01:00', '15:03:00', '16:43:00', '14:11:00']
df['time_entry2'] = ['13:03:00', '14:04:00', '19:23:00', '18:12:00']

print(df)
  time_entry time_entry2
0   12:01:00    13:03:00
1   15:03:00    14:04:00
2   16:43:00    19:23:00
3   14:11:00    18:12:00

将两列都转换为datetime dtype

df['time_entry'] = pd.to_datetime(df['time_entry'], format= '%H:%M:%S', errors='ignore')
df['time_entry2'] = pd.to_datetime(df['time_entry2'], format= '%H:%M:%S', errors='ignore')

print(df)
           time_entry         time_entry2
0 1900-01-01 12:01:00 1900-01-01 13:03:00
1 1900-01-01 15:03:00 1900-01-01 14:04:00
2 1900-01-01 16:43:00 1900-01-01 19:23:00
3 1900-01-01 14:11:00 1900-01-01 18:12:00

print(df.dtypes)
time_entry     datetime64[ns]
time_entry2    datetime64[ns]
dtype: object

(可选)Specify timezone

df['time_entry'] = df['time_entry'].dt.tz_localize('US/Central')
df['time_entry2'] = df['time_entry2'].dt.tz_localize('US/Central')

现在执行两列之间的时间差(减法)并获得天数的时间差(作为浮点数)

df['Diff_days1'] = (df['time_entry'] - df['time_entry2']).dt.total_seconds()/60/60/24
df['Diff_days2'] = (df['time_entry'] - df['time_entry2']) / np.timedelta64(1, 'D')
df['Diff_days3'] = (df['time_entry'].sub(df['time_entry2'])).dt.total_seconds()/60/60/24

print(df)
           time_entry         time_entry2  Diff_days1  Diff_days2  Diff_days3
0 1900-01-01 12:01:00 1900-01-01 13:03:00   -0.043056   -0.043056   -0.043056
1 1900-01-01 15:03:00 1900-01-01 14:04:00    0.040972    0.040972    0.040972
2 1900-01-01 16:43:00 1900-01-01 19:23:00   -0.111111   -0.111111   -0.111111
3 1900-01-01 14:11:00 1900-01-01 18:12:00   -0.167361   -0.167361   -0.167361

编辑

如果您尝试访问datetime 属性,则可以直接使用time_entry 列(而不是时差列)来实现。这是一个例子

df['day1'] = df['time_entry'].dt.day
df['time1'] = df['time_entry'].dt.time
df['minute1'] = df['time_entry'].dt.minute
df['dayofweek1'] = df['time_entry'].dt.weekday
df['day2'] = df['time_entry2'].dt.day
df['time2'] = df['time_entry2'].dt.time
df['minute2'] = df['time_entry2'].dt.minute
df['dayofweek2'] = df['time_entry2'].dt.weekday

print(df[['day1', 'time1', 'minute1', 'dayofweek1',
        'day2', 'time2', 'minute2', 'dayofweek2']])
   day1     time1  minute1  dayofweek1  day2     time2  minute2  dayofweek2
0     1  12:01:00        1           0     1  13:03:00        3           0
1     1  15:03:00        3           0     1  14:04:00        4           0
2     1  16:43:00       43           0     1  19:23:00       23           0
3     1  14:11:00       11           0     1  18:12:00       12           0

【讨论】:

  • 谢谢,它成功了。我能够创建一个具有它们之间差异的列(节奏)。奇怪的是,执行 df['time_exit'].describe() 表明 dtype 是对象,而执行 print(df.dtypes) 表明 dtype 是 datetime64[ns]。对此有何解释?
  • IIUC, df['time_exit'].describe() 是一个 Pandas Series 具有混合数据类型,因此它显示为 ab object。如果你关心某个列的dtype,那么你必须查看df[col].dtype的输出
【解决方案2】:

dt.time 的目的是什么?

只需删除 dt.time,您从对象到日期时间的转换就可以正常工作了。

df['time_entry'] = pd.to_datetime(df['time_entry'],format= '%H:%M:%S')

【讨论】:

  • 感谢您的评论。执行您的建议会导致 dtype 转换为 int64,但列的所有值都转换为 Nat。
  • 你能从你的数据集中展示一些我可以处理的样本吗?
  • 这是没有转换的数据集的头部(5):i.imgur.com/Ufk7Tvz.jpg
  • 我重启了笔记本的内核,现在你建议的转换输出改变了(这对我来说不科学):i.imgur.com/YGv8V8u.jpg
  • Suyash,我在这里复制上面给 edesz 的答案:谢谢,它有效。我能够创建一个具有它们之间差异的列(节奏)。奇怪的是,执行 df['time_exit'].describe() 表明 dtype 是对象,而执行 print(df.dtypes) 表明 dtype 是 datetime64[ns]。对此有何解释?
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2020-02-27
  • 2017-05-14
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多