How to get hours-minute-seconds from ISO 8601 date time format?

被刻印的时光 ゝ 提交于 2020-01-06 06:10:40

问题


I am working with an Excel file in Pandas where I am trying to deal with a Date column where the Date is listed in ISO 8601 format. I want to take this column and store the date and time in two different columns.The values in these two columns need to be stored in Eastern Daylight Savings. This is what they are supposed to look like

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

I have achieved this, partially. I have converted the values to Eastern Daylight savings time and successfully stored the Date value correctly. However, I want the time value to be stored in the 12 hours format and not in the 24 hours format as it is being right now?

This is what my output looks like so far.

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

Does anyone have any idea what i can do for this?

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']])

回答1:


You can set the time format used for outputting - the time value itself is (and should be) stored as datetime.time() - if you want a specific string representation you can create a string-type column in the format you want:

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)

Output:

# 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:


You should use d.time().strftime("%I:%M:%S %p") which will format the date as requested.

strftime() and strptime() Behavior




回答3:


It looks like you are very close. %H is the 24 hour format. You should use %I instead.

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



来源:https://stackoverflow.com/questions/54030619/how-to-get-hours-minute-seconds-from-iso-8601-date-time-format

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!