我有一個數據幀提供與今年年份和星期的兩個整列:熊貓:如何從周和年創建日期時間對象?
import pandas as pd
import numpy as np
L1 = [43,44,51,2,5,12]
L2 = [2016,2016,2016,2017,2017,2017]
df = pd.DataFrame({"Week":L1,"Year":L2})
df
Out[72]:
Week Year
0 43 2016
1 44 2016
2 51 2016
3 2 2017
4 5 2017
5 12 2017
我需要創建這兩個數字的日期時間對象。
我想這一點,但它拋出一個錯誤:
df["DT"] = df.apply(lambda x: np.datetime64(x.Year,'Y') + np.timedelta64(x.Week,'W'),axis=1)
然後我想這一點,它的工作原理,但給出了錯誤的結果,那就是它忽略了完全的一週:
df["S"] = df.Week.astype(str)+'-'+df.Year.astype(str)
df["DT"] = df["S"].apply(lambda x: pd.to_datetime(x,format='%W-%Y'))
df
Out[74]:
Week Year S DT
0 43 2016 43-2016 2016-01-01
1 44 2016 44-2016 2016-01-01
2 51 2016 51-2016 2016-01-01
3 2 2017 2-2017 2017-01-01
4 5 2017 5-2017 2017-01-01
5 12 2017 12-2017 2017-01-01
我真的在Python的datetime
,Numpy的datetime64
和pandas Timestamp
之間迷路了,你能告訴我它是如何正確完成的嗎?
我正在使用Python 3,如果這是相關的任何方式。
是'Week'值[ISO週數(https://en.wikipedia.org/wiki/ISO_week_date)或做他們所代表7天爲單位? – unutbu
最初我在's'中有時間戳,它們使用'pd.to_datetime()'轉換,然後通過使用Timestamp上的'dt.week'來提取一週。 – Khris
這裏存在一個微妙的缺陷 - 如果's'包含日期'2016-1-1',那麼它的ISO周編號(由'dt.week'返回)是53,而它的ISO年(你沒有' t記錄)是2015年。如果您嘗試使用2016年和ISO第53周重新構建日期,那麼您將得到2017-01-02(假定星期一從本週開始)。因此,除非您還記錄ISO年(不總是與實際年相同),否則無法正確往返。 – unutbu