使用 Pandas 将字符串格式化为日期时间 - 指令问题
Posted
技术标签:
【中文标题】使用 Pandas 将字符串格式化为日期时间 - 指令问题【英文标题】:Formatting string into datetime using Pandas - trouble with directives 【发布时间】:2016-11-30 17:12:18 【问题描述】:我有一个字符串,即全年后跟 ISO 一年中的一周(所以有些年份有 53 周,因为周数从一年中的第一个完整周开始)。我想使用pandas.to_datetime()
将其转换为datetime
对象。所以我这样做:
pandas.to_datetime('201145', format='%Y%W')
然后它返回:
Timestamp('2011-01-01 00:00:00')
这是不对的。或者,如果我尝试:
pandas.to_datetime('201145', format='%Y%V')
它告诉我%V
是一个错误的指令。
我做错了什么?
【问题讨论】:
我认为这可能是一个错误。 docs.python.org/2/library/… 可能值得在 github 上报告(也许是 this one,但我认为它不同) 【参考方案1】:我认为以下问题对您有用:Reversing date.isocalender()
使用该问题中提供的功能,这就是我将如何进行:
import datetime
import pandas as pd
def iso_year_start(iso_year):
"The gregorian calendar date of the first day of the given ISO year"
fourth_jan = datetime.date(iso_year, 1, 4)
delta = datetime.timedelta(fourth_jan.isoweekday()-1)
return fourth_jan - delta
def iso_to_gregorian(iso_year, iso_week, iso_day):
"Gregorian calendar date for the given ISO year, week and day"
year_start = iso_year_start(iso_year)
return year_start + datetime.timedelta(days=iso_day-1, weeks=iso_week-1)
def time_stamp(yourString):
year = int(yourString[0:4])
week = int(yourString[-2:])
day = 1
return year, week, day
yourTimeStamp = iso_to_gregorian( time_stamp('201145')[0] , time_stamp('201145')[1], time_stamp('201145')[2] )
print yourTimeStamp
然后为您的值运行该函数并将它们作为日期时间对象附加到数据框。
我从你指定的字符串得到的结果是:
2011-11-07
【讨论】:
如果我想不通的话,我只是在开玩笑说必须将字符串解析为前四个字符和后两个字符。猜猜事实证明这就是答案。谢谢! 所以我在一个非常大的 DataFrame 上尝试了这个,它非常慢 - 大约 60k 行需要大约 3 分钟:time_convert_func = lambda x: iso_to_gregorian( time_stamp(x)[0] , time_stamp(x)[1], time_stamp(x)[2] )
然后是result = df['startdate'].astype(str).apply(time_convert_func)
有什么建议吗?以上是关于使用 Pandas 将字符串格式化为日期时间 - 指令问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Freemarker 将 CRM“仅日期”字段格式化为字符串?
pandas使用strftime函数将dataframe的日期格式数据列按照指定格式(format)转化为日期(时间)字符串数据列