我创建了一个timedelta对象列表,我需要得到这个列表的平均值.当我尝试做的时候
return (sum(delta_list)/(len(delta_list)-1))
Run Code Online (Sandbox Code Playgroud)
我得到TypeError:不支持的操作数类型+:'int'和'datetime.timedelta'
我是使用pythons datetime类的新手.我也想知道如何将这个平均值变成像天的格式:小时:分钟:我不需要任何小于分钟的东西.
我有一个像这样的pandas数据框:
Name start end
A 2000-01-10 1970-04-29
Run Code Online (Sandbox Code Playgroud)
我想添加一个新列,提供年份,月份,天数start
与end
列之间的差异.
所以结果应该是这样的:
Name start end diff
A 2000-01-10 1970-04-29 29y9m etc.
Run Code Online (Sandbox Code Playgroud)
diff列也可以是一个datetime
对象或一个timedelta
对象,但对我而言,关键在于,我可以轻松地从中获取年份和月份.
我到现在为止尝试的是:
df['diff'] = df['end'] - df['start']
Run Code Online (Sandbox Code Playgroud)
这导致新列包含10848 days
.但是,我不知道如何将天数转换为29y9m等.
我试图有一些聪明的日期,因为在我的网站上发布了一个帖子("从那以后的几秒钟,从那以后的几个小时,从那以后的几周......")我正在使用存储在其中的utcnow和utc之间的datetime.timedelta差异一个帖子的数据库.
看起来,根据文档,我必须使用days属性和seconds属性来获取我想要的花哨日期字符串.
难道我不能在任何时间进入单位我想要的全部差异的价值?我错过了什么吗?
如果我能在几秒钟内得到完整的差异,那将是完美的.
我的数据集如下:
Date Value
1/1/1988 0.62
1/2/1988 0.64
1/3/1988 0.65
1/4/1988 0.66
1/5/1988 0.67
1/6/1988 0.66
1/7/1988 0.64
1/8/1988 0.66
1/9/1988 0.65
1/10/1988 0.65
1/11/1988 0.64
1/12/1988 0.66
1/13/1988 0.67
1/14/1988 0.66
1/15/1988 0.65
1/16/1988 0.64
1/17/1988 0.62
1/18/1988 0.64
1/19/1988 0.62
1/20/1988 0.62
1/21/1988 0.64
1/22/1988 0.62
1/23/1988 0.60
Run Code Online (Sandbox Code Playgroud)
我用这段代码来读取这些数据
df.set_index(df['Date'], drop=False, append=False, inplace=False, verify_integrity=False).drop('Date', 1)
Run Code Online (Sandbox Code Playgroud)
但问题是索引不是日期格式.那么问题是如何将此列设置为日期索引?
我有一个pandas数据框,有两列,一个日期列和一个int列,我只想将int列(以天为单位)添加到日期列.我找到了一个使用df.apply()的解决方案,但这对我的完整数据集来说太慢了.我没有看到大量关于以矢量化方式进行此操作的文档(我能找到的最接近的是这个),所以我想确保我找到的解决方案是最好的方法.
我的原始数据只是一列字符串作为一列int(天).
import pandas as pd
from datetime import timedelta
df = pd.DataFrame([['2016-01-10',28],['2016-05-11',28],['2016-02-23',15],['2015-12-08',30]],
columns = ['ship_string','days_supply'])
print df
ship_string days_supply
0 2016-01-10 28
1 2016-05-11 28
2 2016-02-23 15
3 2015-12-08 30
Run Code Online (Sandbox Code Playgroud)
我的第一个想法(有效)是使用.apply如下:
def f(x):
return x['ship_date'] + timedelta(days=x['days_supply'] )
df['ship_date'] = pd.to_datetime(df['ship_string'])
df['supply_ended'] = df.apply(f,axis = 1)
Run Code Online (Sandbox Code Playgroud)
这很有效,但速度非常慢.我在下面发布了我的备用解决方案作为问题的答案,但我想确认它是"最佳实践".我没有找到很多关于将时间线列添加到熊猫日期中的好线程(特别是以矢量化的方式),所以我想添加一个更友好的用户,希望它能帮助下一个可怜的灵魂尝试做这个.
我想从下面显示的两列中计算一个mean
和standard deviation
一个timedelta
银行dataframe
.当我运行代码(也显示如下)时,我得到以下错误:
pandas.core.base.DataError: No numeric types to aggregate
Run Code Online (Sandbox Code Playgroud)
我的数据帧:
bank diff
Bank of Japan 0 days 00:00:57.416000
Reserve Bank of Australia 0 days 00:00:21.452000
Reserve Bank of New Zealand 55 days 12:39:32.269000
U.S. Federal Reserve 8 days 13:27:11.387000
Run Code Online (Sandbox Code Playgroud)
我的代码:
means = dropped.groupby('bank').mean()
std = dropped.groupby('bank').std()
Run Code Online (Sandbox Code Playgroud) 如果这是密集的,请提前抱歉.我试图找到自上次发布推文以来的日子.我遇到的问题是日期不同,例如今天和昨天,但没有足够的时间过去是一个完整的"日子".
# "created_at" is part of the Twitter API, returned as UTC time. The
# timedelta here is to account for the fact I am on the west coast, USA
lastTweetAt = result.created_at + timedelta(hours=-8)
# get local time
rightNow = datetime.now()
# subtract the two datetimes (which gives me a timedelta)
dt = rightNow - lastTweetAt
# print the number of days difference
print dt.days
Run Code Online (Sandbox Code Playgroud)
问题是,如果我昨天下午5点发布推文并且今天上午8点正在运行脚本,那么仅过了15个小时,即0天.但显然我想说自从我上一条推文以来已经过了1天,如果是昨天的话.并且添加"+1"的补丁并没有帮助,因为如果我今天发推文,我希望结果为0.
有没有比使用timedelta更好的方法来获得差异?
解决方案 由Matti Lyra提供
答案是在日期时调用.date(),以便将它们转换为更粗糙的日期对象(没有时间戳).正确的代码如下:
# "created_at" is part of the Twitter API, …
Run Code Online (Sandbox Code Playgroud) 我想用mmddyyyy格式制作一系列日期.日期将从当天开始,然后在未来两周内开始.所以这一切都取决于开始日期.当我运行我的代码时,我得到一个错误,指出:
Traceback (most recent call last):
File "timeTest.py", line 8, in <module>
day = datetime.timedelta(days=i)
AttributeError: type object 'datetime.datetime' has no attribute 'timedelta'
Run Code Online (Sandbox Code Playgroud)
我不确定为什么会这样,因为在网上搜索后,我注意到人们正在以这种方式使用'timedelta'.
这是我的代码:
import time
from datetime import datetime, date, time, timedelta
dayDates = []
today = datetime.now()
dayDates.append(today.strftime("%m%d%Y"))
for i in range(0,14):
day = today + datetime.timedelta(days=i)
print day
Run Code Online (Sandbox Code Playgroud) 我有一个TimeDelta列,其值如下所示:
2天21:54:00.000000000
我想有一个表示天数的浮点数,让我们说这里2 + 21/24 = 2.875,忽略了分钟数.有一个简单的方法吗?我看到了一个答案
res['Ecart_lacher_collecte'].apply(lambda x: float(x.item().days+x.item().hours/24.))
Run Code Online (Sandbox Code Playgroud)
但我得到"AttributeError:'str'对象没有属性'item'"
Numpy版本是'1.10.4'Pandas版本是u'0.17.1'
这些列最初是通过以下方式获得的:
lac['DateHeureLacher'] = pd.to_datetime(lac['Date lacher']+' '+lac['Heure lacher'],format='%d/%m/%Y %H:%M:%S')
cap['DateCollecte'] = pd.to_datetime(cap['Date de collecte']+' '+cap['Heure de collecte'],format='%d/%m/%Y %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)
在第一个脚本中.然后在第二个:
res = pd.merge(lac, cap, how='inner', on=['Loc'])
res['DateHeureLacher'] = pd.to_datetime(res['DateHeureLacher'],format='%Y-%m-%d %H:%M:%S')
res['DateCollecte'] = pd.to_datetime(res['DateCollecte'],format='%Y-%m-%d %H:%M:%S')
res['Ecart_lacher_collecte'] = res['DateCollecte'] - res['DateHeureLacher']
Run Code Online (Sandbox Code Playgroud)
也许将它保存到csv将其类型更改回字符串?我想要做的转变是在第三个脚本中.
Sexe_x PiegeLacher latL longL Loc Col_x DateHeureLacher Nb envolees PiegeCapture latC longC Col_y Sexe_y Effectif DateCollecte DatePose Ecart_lacher_collecte Dist_m
M Q0-002 1629238 237877 H Rouge 2011-02-04 17:15:00 928 Q0-002 1629238 …
Run Code Online (Sandbox Code Playgroud) 我正在用 Python 做一些时间计算。
其中一部分是试图:
给定一个日期,加上时间间隔(X 年,X 个月,X 周),返回日期
IE
我查看了 datetime 和datetime.timedelta 文档
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, week=0)¶。
如果我想增加一定数量的小时数或周数,这些似乎效果很好。然而,
例如
start = datetime.datetime(2000, 1, 1)
# expected output: datetime.datetime(2001, 1, 1)
# with the weeks, etc arguments given in timedelta, this fails unsurprisingly e.g
start + datetime.timedelta(weeks = 52)
# returns datetime.datetime(2000, 12, 30, 0, 0)
Run Code Online (Sandbox Code Playgroud)
使用 datetime 的基本工具是否可以进行基于年份的操作 - 如果可以,我将如何进行?
我意识到对于年份示例,我可以只做 …