- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个包含 3 列 ID
、vrddat
、enddat
和 21000 行的数据集。
ID vrddat enddat
1 2015.01.01 2015.01.03
2 2015.03.01 2015.03.03
PS:每个ID可以有多个vrddat和enddat。
我需要如下输出:
ID vrddat enddat day
1 2015.01.01 2015.01.03 2015.01.01
1 2015.01.01 2015.01.03 2015.01.02
1 2015.01.01 2015.01.03 2015.01.03
2 2015.03.01 2015.03.03 2015.03.01
2 2015.03.01 2015.03.03 2015.03.02
2 2015.03.01 2015.03.03 2015.03.03
我使用以下代码来获得上述输出
for index,row in data.iterrows():
data_2 = pd.DataFrame(pd.date_range(row['vrddat'],row['enddat'], freq ='D'))
使用上面的代码我只得到 98 行,但理想情况下输出应该包含比输入更多的行。任何人都可以建议为什么我会得到这种输出。我的代码不是迭代每一行吗?如何在输出中获取 ID
、vrddat
和 enddat
变量?
请提出建议。
最佳答案
您可以使用第一个 Actor to_datetime
两列 vrddat
和 enddat
,然后使用 itertuples
与 concat
用于创建新的扩展DataFrame
。最后merge
,但 df
中的 ID
必须是唯一的。
df.vrddat = pd.to_datetime(df.vrddat)
df.enddat = pd.to_datetime(df.enddat)
df1 = pd.concat([pd.Series(r.ID,pd.date_range(r.vrddat, r.enddat)) for r in df.itertuples()])
.reset_index()
df1.columns = ['day','ID']
print (df1)
day ID
0 2015-01-01 1
1 2015-01-02 1
2 2015-01-03 1
3 2015-03-01 2
4 2015-03-02 2
5 2015-03-03 2
print (pd.merge(df,df1, on='ID', how='left'))
ID vrddat enddat day
0 1 2015-01-01 2015-01-03 2015-01-01
1 1 2015-01-01 2015-01-03 2015-01-02
2 1 2015-01-01 2015-01-03 2015-01-03
3 2 2015-03-01 2015-03-03 2015-03-01
4 2 2015-03-01 2015-03-03 2015-03-02
5 2 2015-03-01 2015-03-03 2015-03-03
如果ID
不唯一,可以使用唯一
索引进行合并:
df.vrddat = pd.to_datetime(df.vrddat)
df.enddat = pd.to_datetime(df.enddat)
df = df.reset_index()
df1=pd.concat([pd.Series(r.index,pd.date_range(r.vrddat,r.enddat)) for r in df.itertuples()])
.reset_index()
df1.columns = ['day','index']
print (df1)
day index
0 2015-01-01 0
1 2015-01-02 0
2 2015-01-03 0
3 2015-03-01 1
4 2015-03-02 1
5 2015-03-03 1
print (pd.merge(df,df1, on='index', how='left').drop('index', axis=1))
ID vrddat enddat day
0 1 2015-01-01 2015-01-03 2015-01-01
1 1 2015-01-01 2015-01-03 2015-01-02
2 1 2015-01-01 2015-01-03 2015-01-03
3 2 2015-03-01 2015-03-03 2015-03-01
4 2 2015-03-01 2015-03-03 2015-03-02
5 2 2015-03-01 2015-03-03 2015-03-03
关于python - pandas :pd. date_range 输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41392062/
这个问题在这里已经有了答案: Pandas Date Range Monthly on Specific Day of Month (3 个回答) 2年前关闭。 我想获得一个日期范围,其中每个月的日期
当我输入“2015-08”等值时,我的 date_range 会按预期工作。如果我使用 startdate 变量,那么它就不再起作用了?我不明白为什么会这样。 我收到的错误是“无法将输入转换为时间戳”
我试图在 Python 中指定一个从当天前一天开始的日期范围。但是,我希望该日期范围从 10:00:00 开始。 这是我目前使用的代码 import pandas as pd import datet
我正在处理如何反向创建日期范围的问题。我正在尝试这个: import pandas as pd dates = pd.date_range(end='2/08/2014', periods=104,
我想在特定日期之间创建日期范围,每天有一定的采样,但每一天都应该从午夜开始: ['2017-01-01 00:00:00', '2017-01-01 05:00:00','2017-01-01 10:
运行这段代码时: a = pd.date_range("1959-12-09 00:00:00", "2013-12-09 12:00:00", freq = "365D6H") weekDays =
我想从这个带日期的列表中得到一个只有“天”的列表。我使用 pd.date_range 生成日期,然后将其转换为字符串。 date = '20170101' fecha = pd.date_range(
我可以使用指定月份结束的日期范围 import pandas as pd monthend_range = pd.date_range(datetime.date(2017,12,10), datet
如何才能在我的频率中添加仅两天?我想选择星期三和星期一。下面的代码仅在我的数据中生成星期三。 pd.date_range(11/21/2019, periods=5, freq='W-WED') 最佳
我正在尝试创建一个日期范围,该范围从特定日期开始以六个月为增量。因此,如果 end_date 是 2020/01/15,那么在此之前的日期将是 2019/07/15,然后是 2019/01/15,依此
我正在尝试使用 pd.date_range() 创建一个跨越多天且频率以秒为单位的 DatetimeIndex。但是,每天的时间范围应该限制在05:00:00和22:00:00之间 类似的东西(当然行
当使用 pandas (v. 13.1) date_range 函数时,我得到关于“end”是否在返回范围内的不一致行为: In [1]: pd.date_range(start='2014-06-0
我正在尝试使用 Python 生成一系列半年度日期。 Pandas 提供了一个函数 pd.date_range为了解决这个问题,我希望我的日期范围从结束日期开始并向后迭代。 例如给定输入: start
我正在尝试生成每月数据的日期范围,其中日期总是在月初: pd.date_range(start='1/1/1980', end='11/1/1991', freq='M') 这会生成 1/31/198
我有一个 Dataframe,其中一列有 DateTime 列。 我只对直到秒的日期时间值感兴趣。所以例如 df = pd.DataFrame({'a': np.random.rand(5),
寻找一种复杂的方式循环遍历日期范围并仅在每个星期日运行。 import pandas for da in pandas.date_range("20181101","20181217",freq='B
我的数据框如下所示: df[['reported_date', 'current_date']].head() reported_date current_date 0 20
我想要一个时间戳列表,范围从 00:00:00 到 23:45:00 使用 pandas date_range. 我试过这样 pd.date_range(start=pd.Timestamp('00:
pd.date_range 不接受开始和结束日期的字符串变量。我将我的开始和结束日期作为来自另一个数据框的变量: start_date = yoy_traffic_df['dt'].iloc[0] e
val.index[-1] = '2019-08-01' pd.date_range(start = val.index[-1], periods = 6,freq='M').tolist() [Ti
我是一名优秀的程序员,十分优秀!