【问题标题】:How to get hours-minute-seconds from ISO 8601 date time format?如何从 ISO 8601 日期时间格式中获取小时-分钟-秒?
【发布时间】:2019-05-30 12:49:25
【问题描述】:

我正在处理 Pandas 中的 Excel 文件,我正在尝试处理 日期列,其中日期以 ISO 8601 格式列出。我想取这一列并将日期和时间存储在两个不同的列中。这两列中的值需要存储在东部夏令时。这就是他们应该的样子

Date                    Date (New)  Time (New)
1999-01-01T00:00:29.75  12/31/1998  6:59:58 PM
1999-01-01T00:00:30.00  12/31/1998  6:59:59 PM
1999-01-01T00:00:32.25  12/31/1998  7:00:00 PM
1999-01-01T00:00:30.50  12/31/1998  6:59:58 PM

我已经部分实现了这一点。 我已将这些值转换为东部夏令时间并成功地正确存储了日期值。但是,我希望时间值以 12 小时格式存储,而不是像现在这样以 24 小时格式存储?

这是我目前的输出。

Date                  Date (New)    Time (New)
1999-01-01T00:00:29.75  1998-12-31  19:00:30
1999-01-01T00:00:30.00  1998-12-31  19:00:30
1999-01-01T00:00:32.25  1998-12-31  19:00:32
1999-01-01T00:00:30.50  1998-12-31  19:00:31

有人知道我可以为此做些什么吗?

from pytz import timezone

import dateutil.parser

from pytz import UTC

import datetime as dt

df3['Day']=pd.to_datetime(df['Date'], format='%Y-%m-%d %H:%M:    %S.%f',errors='coerce').dt.tz_localize('UTC')

df3['Day']= df3['Day'].dt.tz_convert('US/Eastern')
df3['Date(New)'], df3['Time(New)'] = zip(*[(d.date(), d.time()) for d in  df3['Day']])

【问题讨论】:

  • 为什么您认为您的时间是“以 24 小时格式存储的”?它存储为 datetime.time ...这只是一个显示问题

标签: python pandas datetime time


【解决方案1】:

您可以设置用于输出的时间格式 - 时间值本身(并且应该)存储为 datetime.time() - 如果您想要特定的字符串表示,您可以创建一个您想要格式的字符串类型列:

from pytz import timezone 
import pandas as pd
import datetime as dt

df= pd.DataFrame([{"Date":dt.datetime.now()}]) 

df['Day']=pd.to_datetime( df['Date'], format='%Y-%m-%d %H:%M:    %S.%f',
                          errors='coerce').dt.tz_localize('UTC')

df['Day']= df['Day'].dt.tz_convert('US/Eastern')
df['Date(New)'], df['Time(New)'] = zip(*[(d.date(), d.time()) for d in  df['Day']]) 

# create strings with specific formatting
df['Date(asstring)'] = df['Day'].dt.strftime("%Y-%m-%d")
df['Time(asstring)'] = df["Day"].dt.strftime("%I:%M:%S %p") 

# show resulting column / cell types
print(df.dtypes)
print(df.applymap(type))
# show df
print(df)

输出:

# df.dtypes
Date                          datetime64[ns]
Day               datetime64[ns, US/Eastern]
Date(New)                             object
Time(New)                             object
Date(asstring)                        object
Time(asstring)                        object

# from df.applymap(type)
Date            <class 'pandas._libs.tslib.Timestamp'>
Day             <class 'pandas._libs.tslib.Timestamp'>  
Date(New)       <class 'datetime.date'>
Time(New)       <class 'datetime.time'>
Date(asstring)  <class 'str'>
Time(asstring)  <class 'str'>

# from print(df)
                        Date                              Day   Date(New)        Time(New) 
0 2019-01-04 00:40:02.802606 2019-01-03 19:40:02.802606-05:00  2019-01-03  19:40:02.802606 

Date(asstring) Time(asstring)
    2019-01-03    07:40:02 PM

【讨论】:

  • 帕特里克,我感激不尽。在处理日期时间方面,我有点新手。我希望能做得更好!!现在,如果可以的话,请提供更多帮助!!!
  • Time(asstring) 列比我预期的要提前大约 32 秒。我应该在下午 6:59:58 得到 07:00:29 PM。你知道为什么会这样吗?
  • @sanster9292 我使用 datetime.datetime.now 作为输入 - 我创建的时间超过 所有 次:00:40:02.802606 19:40:02.802606-05:00 19:40:02.802606 07:40:02 PM - 两者之间没有 30 秒的差异。我的代码会给您带来差异还是您的数据给您带来差异? 5 小时前对我来说是凌晨 4 点。如果你过去去一些特殊的日期或奇怪的时区,会发生一些奇怪的事情。链接:weird-timezone-issue-with-pytz
  • 是的,我认为这只是数据本身。我仔细检查了逻辑。我想也可能是我在一个奇怪的时区。
【解决方案2】:

您应该使用d.time().strftime("%I:%M:%S %p"),它将按要求格式化日期。

strftime() and strptime() Behavior

【讨论】:

  • @StevenJohnson 你说的不太对,但在正确的轨道上。请参阅我对您的回答的评论。
  • 这将设置所有 datetime.time() 列的输出格式?
  • @PatrickArtner 在这种情况下只有一个 datetime.time() 列,并且只能在该列上工作。
  • 数据框为 df3。 d 只是我用于列表理解的变量
  • 不错的答案,不错的 cmets。
【解决方案3】:

看起来你们很亲密。 %H 是 24 小时格式。您应该改用 %I。

How can I account for period (AM/PM) with datetime.strptime?

【讨论】:

  • 该格式是正确的,因为它决定了如何从数据框中读取字符串日期。实际上,在创建新数据框时,格式需要更改。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2021-12-27
  • 2021-06-06
相关资源
最近更新 更多