使用 pandas 转换 Excel 样式日期
- 2024-12-18 08:39:00
- admin 原创
- 130
问题描述:
我必须解析一个 xml 文件,该文件提供 Excel 样式的日期时间;例如:42580.3333333333
。
Pandas 是否提供了将该数字转换为常规对象的方法datetime
?
解决方案 1:
您可以直接使用pd.to_datetime
、 关键字unit='D'
和进行解析origin='1899-12-30'
:
import pandas as pd
df = pd.DataFrame({'xldate': [42580.3333333333]})
df['date'] = pd.to_datetime(df['xldate'], unit='D', origin='1899-12-30')
df['date']
Out[2]:
0 2016-07-29 07:59:59.999971200
Name: date, dtype: datetime64[ns]
进一步阅读:
1899 年 12 月 30 日作为基准日期的背后有何故事?
Martijn Pieters 的回答如何正确处理 excel 序数值 < 60
解决方案 2:
TimedeltaIndex
好的,我认为最简单的方法是从浮点数构造一个并将其添加到标量日期时间中1900,1,1
:
In [85]:
import datetime as dt
import pandas as pd
df = pd.DataFrame({'date':[42580.3333333333, 10023]})
df
Out[85]:
date
0 42580.333333
1 10023.000000
In [86]:
df['real_date'] = pd.TimedeltaIndex(df['date'], unit='d') + dt.datetime(1900,1,1)
df
Out[86]:
date real_date
0 42580.333333 2016-07-31 07:59:59.971200
1 10023.000000 1927-06-12 00:00:00.000000
好的,看来 excel 的日期有点奇怪,谢谢@ayhan:
In [89]:
df['real_date'] = pd.TimedeltaIndex(df['date'], unit='d') + dt.datetime(1899, 12, 30)
df
Out[89]:
date real_date
0 42580.333333 2016-07-29 07:59:59.971200
1 10023.000000 1927-06-10 00:00:00.000000
参见:如何将 python datetime.datetime 转换为 excel 序列日期数字
解决方案 3:
xlrd
您可以在传递给之前使用第三方库pd.to_datetime
:
import xlrd
def read_date(date):
return xlrd.xldate.xldate_as_datetime(date, 0)
df = pd.DataFrame({'date':[42580.3333333333, 10023]})
df['new'] = pd.to_datetime(df['date'].apply(read_date), errors='coerce')
print(df)
date new
0 42580.333333 2016-07-29 08:00:00
1 10023.000000 1927-06-10 00:00:00
解决方案 4:
解决该问题的另一种方法是使用 pd.Series 的“应用 lambda”:
xl_date = 42580
df['DATE SERIES'] = df['DATE SERIES'].apply(lambda x: datetime.fromordinal(datetime(1900, 1, 1).toordinal() + xldate - 2))
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD