strftime 格式化 - 我做错了什么?
strftime formatting - what am I doing wrong?
我有一个字符串 3:01 AM - 2017 年 12 月 18 日
我已经编写了以下模式 strftime('%-I:%M %p - %-d %b %Y')
但我似乎无法让它工作,遵循 this
我的笔记:
%-I
十进制形式的 12 小时时钟(无零填充)
:
时分分离
%M
分钟作为补零的小数点
%p
AM/PM
-
space-破折号-space 时间和日期之间的模式
%-d
小数形式的月份日期(无零填充)
%b
月份缩写
%Y
以十进制表示世纪的年份
df['tweet_date'] = pd.to_datetime(df['tweet_date'], errors='coerce').apply(lambda x: x.strftime('%I:%M %p - %d %b %Y')if not pd.isnull(x) else '')
在另一个具有类似列的数据框中,这有效:
df2['created_at'] = pd.to_datetime(df2['created_at'], errors='coerce').apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S')if not pd.isnull(x) else '')
df2['created_at'] = df2['created_at'].astype('datetime64[s]')`
格式化前的值如下所示,例如 2017-10-03T15:48:10.000Z
from datetime import datetime
str="3:01 AM - 18 Dec 2017"
date=datetime.strptime(str,"%I:%M %p - %d %b %Y")
要将字符串变成时间,请执行以下操作:
>>> import time
>>> s = "3:01 AM - 18 Dec 2017"
>>> time.strptime(s,'%I:%M %p - %d %b %Y')
time.struct_time(tm_year=2017, tm_mon=12, tm_mday=18, tm_hour=3, tm_min=1,
tm_sec=0, tm_wday=0, tm_yday=352, tm_isdst=-1)
%
后没有连字符。 official Python documentation.
中未提及
您的格式很好,但有些 os 不能对零填充单元使用否定格式。 datetime
应该能够解析 those 的填充和非填充实例就好了:
from datetime import datetime as dt
z_time = '06:48 PM - 03 Jun 2021'
nz_time = '6:48 PM - 3 Jun 2021'
dt.strptime(z_time, '%I:%M %p - %d %b %Y')
[out:] datetime.datetime(2021, 6, 3, 18, 48)
dt.strptime(nz_time, '%I:%M %p - %d %b %Y')
[out:] datetime.datetime(2021, 6, 3, 18, 48)
并且由于您是从 datetime
获取字符串,因此您应该查看 os 是否支持某些格式规则。这是一个 for windows.
我想弄清楚如何在 lambda 函数或更好的函数中使用 strftime
,在我的数据框中的列转换为日期时间后使用 .dt
访问器
我无法解决这个问题,所以我选择了下一个最快的方法
from datetime import datetime
formatted_dates = []
for item in df.tweet_date:
formatted_dates.append(datetime.strptime(item,"%I:%M %p - %d %b %Y"))
df.tweet_date = formatted_dates
我有一个字符串 3:01 AM - 2017 年 12 月 18 日
我已经编写了以下模式 strftime('%-I:%M %p - %-d %b %Y')
但我似乎无法让它工作,遵循 this
我的笔记:
%-I
十进制形式的 12 小时时钟(无零填充):
时分分离%M
分钟作为补零的小数点%p
AM/PM-
space-破折号-space 时间和日期之间的模式%-d
小数形式的月份日期(无零填充)%b
月份缩写%Y
以十进制表示世纪的年份
df['tweet_date'] = pd.to_datetime(df['tweet_date'], errors='coerce').apply(lambda x: x.strftime('%I:%M %p - %d %b %Y')if not pd.isnull(x) else '')
在另一个具有类似列的数据框中,这有效:
df2['created_at'] = pd.to_datetime(df2['created_at'], errors='coerce').apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S')if not pd.isnull(x) else '')
df2['created_at'] = df2['created_at'].astype('datetime64[s]')`
格式化前的值如下所示,例如 2017-10-03T15:48:10.000Z
from datetime import datetime
str="3:01 AM - 18 Dec 2017"
date=datetime.strptime(str,"%I:%M %p - %d %b %Y")
要将字符串变成时间,请执行以下操作:
>>> import time
>>> s = "3:01 AM - 18 Dec 2017"
>>> time.strptime(s,'%I:%M %p - %d %b %Y')
time.struct_time(tm_year=2017, tm_mon=12, tm_mday=18, tm_hour=3, tm_min=1,
tm_sec=0, tm_wday=0, tm_yday=352, tm_isdst=-1)
%
后没有连字符。 official Python documentation.
您的格式很好,但有些 os 不能对零填充单元使用否定格式。 datetime
应该能够解析 those 的填充和非填充实例就好了:
from datetime import datetime as dt
z_time = '06:48 PM - 03 Jun 2021'
nz_time = '6:48 PM - 3 Jun 2021'
dt.strptime(z_time, '%I:%M %p - %d %b %Y')
[out:] datetime.datetime(2021, 6, 3, 18, 48)
dt.strptime(nz_time, '%I:%M %p - %d %b %Y')
[out:] datetime.datetime(2021, 6, 3, 18, 48)
并且由于您是从 datetime
获取字符串,因此您应该查看 os 是否支持某些格式规则。这是一个 for windows.
我想弄清楚如何在 lambda 函数或更好的函数中使用 strftime
,在我的数据框中的列转换为日期时间后使用 .dt
访问器
我无法解决这个问题,所以我选择了下一个最快的方法
from datetime import datetime
formatted_dates = []
for item in df.tweet_date:
formatted_dates.append(datetime.strptime(item,"%I:%M %p - %d %b %Y"))
df.tweet_date = formatted_dates