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

Python 如何从ISO 8601日期-时间格式中获取小时-分-秒?,python,pandas,datetime,time,Python,Pandas,Datetime,Time,我正在熊猫中处理一个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 199

我正在熊猫中处理一个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']])

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


看来你们很接近了。%H是24小时格式。您应该改用%I


您应该使用
d.time().strftime(“%I:%M:%S%p”)
将根据请求格式化日期


您应该使用
d.time().strftime(“%I:%M:%S%p”)
将根据请求格式化日期


您可以设置用于输出的时间格式-时间值本身(并且应该)存储为
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
#df.dtypes
日期时间64[ns]
Day datetime64[北美洲/东部]
日期(新)对象
时间(新)对象
日期(关联)对象
时间(关联)对象
#来自df.applymap(类型)
日期
白天
日期(新)
时间(新)
日期(asstring)
时间(关联)
#从打印(df)
日期日期(新)时间(新)
0 2019-01-04 00:40:02.802606 2019-01-03 19:40:02.802606-05:00  2019-01-03  19:40:02.802606 
日期(关联)时间(关联)
2019-01-03 07:40:02下午

您可以设置用于输出的时间格式-时间值本身(并且应该)存储为
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
#df.dtypes
日期时间64[ns]
Day datetime64[北美洲/东部]
日期(新)对象
时间(新)对象
日期(关联)对象
时间(关联)对象
#来自df.applymap(类型)
日期
白天
日期(新)
时间(新)
日期(asstring)
时间(关联)
#从打印(df)
日期日期(新)时间(新)
0 2019-01-04 00:40:02.802606 2019-01-03 19:40:02.802606-05:00  2019-01-03  19:40:02.802606 
日期(关联)时间(关联)
2019-01-03 07:40:02下午


为什么您认为您的时间“以24小时格式存储”?它存储为datetime.time。。。这只是一个显示问题。为什么你认为你的时间“以24小时格式存储”?它存储为datetime.time。。。这只是一个显示问题,该格式是正确的,因为它决定了如何从数据帧中读取字符串日期。实际上,在创建新数据帧时,格式需要更改。该格式是正确的,因为它决定如何从数据帧中读取字符串日期。实际上,在创建新的数据帧时,格式需要更改。@StevenJohnson您不太正确,但在正确的轨道上。请参阅我对您答案的评论。这将设置所有datetime.time()列?@PatrickArtner的输出格式。在本例中,只有一个datetime.time()列,并且仅对该列有效。数据帧为df3。d只是我用来理解列表的一个变量。回答得好,评论得好。@StevenJohnson你说得不太对,但在正确的轨道上。请参阅我对您答案的评论。这将设置所有datetime.time()列?@PatrickArtner的输出格式。在本例中,只有一个datetime.time()列,并且仅对该列有效。数据帧为df3。d只是我用来理解列表的一个变量回答得好,评论得好。帕特里克,我非常感谢你。我在处理约会时间方面有点新手。我希望能做得更好!!现在,如果你可以的话,再帮我一点忙!!!时间(asstring)列比我预期的要提前32秒。我现在是晚上7:00:29,而我应该是下午6:59:58。你知道这是为什么吗?@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点。。如果你过去去一些特别的日子或奇怪的时区,就会有奇怪的事情发生。。。林克:是的,我认为这只是数据本身。我反复检查了逻辑。我想也可能是因为我在一个奇怪的时区。帕特里克,我太感谢你了。我在处理约会时间方面有点新手。我希望能做得更好!!现在,如果你可以的话,再帮我一点忙!!!时间(asstring)列比我预期的要提前32秒。我现在是晚上7:00:29,而我应该是下午6:59:58。你知道这是为什么吗?@sanster9292我使用datetime.datetime.now作为输入-我创建时间的所有时间都是相同的:
00:40:02.802606 19:40:02.802606-05:00 19:40:02.802606 07:40:02 PM
-它们之间没有30秒的差异。我的代码有效吗