基于条件在Pandas中转换周日期为具体日期的问题求助(含年首周特殊日期处理)
解决datetime列在np.where后变为时间戳数值的问题
这个问题的核心是np.where会统一输出结果的数据类型,当你混合了标量datetime对象和datetime64类型的Series时,NumPy会将datetime对象转换为纳秒级的int64时间戳数值,导致非目标行显示为大数字。下面是两种简单的解决方案:
方法一:先复制原有datetime列,再修改目标行(推荐)
这种方法直接基于已经处理好的date_week列,保持列的datetime类型不变,操作最简单:
# 先复制已有的标准datetime列 df['date_start'] = df['date_week'].copy() # 定位到2012年第1周的行,修改为目标日期 df.loc[(df['year'] == 2012) & (df['week'] == 1), 'date_start'] = pd.to_datetime('2012-01-01')
执行后你会得到预期的结果:
| year | month | week | sales | date_ix | date_week | date_start | |
|---|---|---|---|---|---|---|---|
| 0 | 2011 | 12 | 51 | 10000 | 2011501 | 2011-12-12 | 2011-12-12 |
| 1 | 2011 | 12 | 52 | 12000 | 2011511 | 2011-12-19 | 2011-12-19 |
| 2 | 2011 | 12 | 53 | 11000 | 2011521 | 2011-12-26 | 2011-12-26 |
| 3 | 2012 | 1 | 1 | 5000 | 2012001 | 2011-12-26 | 2012-01-01 |
| 4 | 2012 | 1 | 2 | 12000 | 2012011 | 2012-01-02 | 2012-01-02 |
| 5 | 2012 | 1 | 3 | 11000 | 2012021 | 2012-01-09 | 2012-01-09 |
方法二:确保np.where的两个分支都是同类型的Series
如果你坚持要用np.where,需要保证两个返回分支都是datetime64类型的Series,而不是单个标量。可以直接复用已有的date_week列(避免重复解析date_ix),并将标量日期转换为匹配长度的Series:
df['date_start'] = np.where( (df['year'] == 2012) & (df['week'] == 1), pd.Series([pd.to_datetime('2012-01-01')]*len(df)), df['date_week'] )
为什么原代码会出错?
你的原代码中,np.where的第二个分支是通过pd.to_datetime(df['date_ix'], format='%Y%W%w')生成的datetime64 Series,而第一个分支是单个Timestamp对象。NumPy在统一类型时,会将datetime对象转换为纳秒级的整数时间戳(比如1323648000000000000就是2011-12-12对应的纳秒数),这就导致了非目标行显示为大数字。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

