如何从ISO 8601日期时间格式中获取时分秒?

时间:2019-01-03 22:23:05

标签: python pandas datetime time

我正在使用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

我已经部分实现了这一目标。 我已经将这些值转换为东部夏令时,并成功地正确存储了Date值。但是,我想将时间值存储为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']])

3 个答案:

答案 0 :(得分:2)

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

strftime() and strptime() Behavior

答案 1 :(得分: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

答案 2 :(得分:0)

您似乎很亲近。 %H是24小时格式。您应该改用%I。

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