使用 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)转化为日期(时间)字符串数据列

Python Pandas 数据以日期格式输出到 excel 的问题 [重复]

Swift:将开始和结束日期格式化为单个字符串

当我将字符串格式化为日期时出现错误的日期