如何在DataFrame中基于起止日期生成日期向量?遇类型转换错误求助
问题
想要在DataFrame中根据给定的起始日期和结束日期生成日期向量,但运行代码时出现错误:Cannot convert an object of type Int64 to an object of type Day。
尝试的代码如下:
using DataFrames, Tidier, TidierDates df = DataFrame(date_start = "2019-01-01", date_end = "2019-01-31") describe(df) df[!, :date_start] = TidierDates.ymd.(df[!, :date_start]) df[!, :date_end] = TidierDates.ymd.(df[!, :date_end]) describe(df) df[1,:date_start]:df[1,:date_end]
还尝试了以下代码,但仍然无效:
date_vec = Dates.value(df[1,:date_start]):1:Dates.value(df[1,:date_end]) |> collect date_days = Dates.Day(date_vec)
解决方案
错误原因
- 第一段代码中,直接用
:对两个Date类型值创建范围会失败,因为Julia默认范围步长是Int类型,而日期类型需要明确指定Day(1)作为步长。 - 第二段代码中,
Dates.value()返回的是日期对应的整数(基准日起的天数),但Dates.Day()仅接受单个整数参数,无法直接处理整数数组,因此报错。
正确实现方式
方法1:指定日期步长创建范围(推荐)
直接使用Date类型的起止值,搭配Day(1)作为步长生成范围,再转为数组:
date_vec = df[1, :date_start]:Day(1):df[1, :date_end] |> collect
方法2:通过整数天数还原日期
先获取起止日期的整数天数,再逐个转换为Day并叠加到起始日期上:
start_val = Dates.value(df[1, :date_start]) end_val = Dates.value(df[1, :date_end]) date_vec = df[1, :date_start] .+ Day.(0:(end_val - start_val))
完整示例代码
using DataFrames, Tidier, TidierDates df = DataFrame(date_start = "2019-01-01", date_end = "2019-01-31") df[!, :date_start] = TidierDates.ymd.(df[!, :date_start]) df[!, :date_end] = TidierDates.ymd.(df[!, :date_end]) # 使用推荐方法生成日期向量 date_vec = df[1, :date_start]:Day(1):df[1, :date_end] |> collect println(date_vec)
内容的提问来源于stack exchange,提问作者rwdvc
相关产品推荐
相关产品推荐

