我有一个datetime列,如下所示 -
>>> df['ACC_DATE'].head(2)
538 2006-04-07
550 2006-04-12
Name: ACC_DATE, dtype: datetime64[ns]
现在,我想从本专栏的每一行中减去一年。我怎样才能实现同样的目标我可以使用哪个库?
预期字段 -
ACC_DATE NEW_DATE
538 2006-04-07 2005-04-07
549 2006-04-12 2005-04-12
感谢。
答案 0 :(得分:46)
您可以使用DateOffset
来实现此目标:
<html>
<head>
<style>
#map {
height: 400px;
width: 700px;
margin: 0px;
padding: 0px
}
</style>
<script src="http://maps.google.com/maps/api/js?v=3&libraries=visualization,places,geometry" type="text/javascript"></script>
<script type="text/javascript">
var side_bar_html = "";
var gmarkers = [];
var myLatlng = new google.maps.LatLng(21.13962399, -86.8928956);
var panorama;
var myOptions = {
zoom: 14,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
function myclick(i) {
google.maps.event.trigger(gmarkers[i], "click");
}
var infoWindow = new google.maps.InfoWindow();
var bounds = new google.maps.LatLngBounds();
function createMarker(point, map, infoWindow, html, CompanyName) {
var marker = new google.maps.Marker({
position: point,
map: map,
title: CompanyName
});
google.maps.event.addListener(marker, 'click', function() {
panorama = map.getStreetView();
panorama.setPosition(marker.getPosition());
google.maps.event.addListenerOnce(panorama, 'status_changed', function() {
var heading = google.maps.geometry.spherical.computeHeading(panorama.getPosition(), marker.getPosition());
panorama.setPov({
heading: heading,
zoom: 1,
pitch: 0
});
});
infoWindow.setContent(html);
infoWindow.open(map, marker);
});
bounds.extend(point);
gmarkers.push(marker);
side_bar_html += '<a href="javascript:myclick(' + (gmarkers.length - 1) + ')">' + CompanyName + '<\/a><br>';
return marker;
}
function initialize() {
var map = new google.maps.Map(document.getElementById("map"), myOptions);
var xmlDoc = xmlParse(xmlStr);
var markers = xmlDoc.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
var CompanyName = markers[i].getAttribute("CompanyName");
var CompanyDescription = markers[i].getAttribute("CompanyDescription");
var CompanyTelephone = markers[i].getAttribute("CompanyTelephone");
var NEWHEADING = parseFloat(markers[i].getAttribute("StreetView"));
var point = new google.maps.LatLng(
parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
var html = "<H3>" + CompanyName + "</H3>" + CompanyDescription + "<BR>Tel: " + CompanyTelephone + "<BR><B>New Heading: " + NEWHEADING + "</B><BR>";
html += '<br /><input type="button" onclick="toggleStreetView();" value="See Street View" />';
var marker = createMarker(point, map, infoWindow, html, CompanyName);
}
document.getElementById("side_bar").innerHTML = side_bar_html;
map.fitBounds(bounds);
}
google.maps.event.addDomListener(window, 'load', initialize);
function toggleStreetView() {
var toggle = panorama.getVisible();
if (toggle === false) {
panorama.setVisible(true);
} else {
panorama.setVisible(false);
}
}
function xmlParse(str) {
if (typeof ActiveXObject != 'undefined' && typeof GetObject != 'undefined') {
var doc = new ActiveXObject('Microsoft.XMLDOM');
doc.loadXML(str);
return doc;
}
if (typeof DOMParser != 'undefined') {
return (new DOMParser()).parseFromString(str, 'text/xml');
}
return createElement('div', null);
}
var xmlStr = '<?xml version="1.0" encoding="UTF-8"?><markers><marker CompanyName="MCDONALDS" CompanyDescription="Tasty Hamburgers To Go" lat="21.141406" lng="-86.83339" StreetView="15.26" CompanyTelephone="01 998 893 6767"/><marker CompanyName="LITTLE CAESARS" CompanyDescription="Best Pizzas Anywhere" lat="21.161016" lng="-86.850647" StreetView="233.56" CompanyTelephone="01 998 893 6767"/><marker CompanyName="VIPS" CompanyDescription="Tasty Food" lat="21.113087" lng="-86.838704" StreetView="320.13" CompanyTelephone="+52 998 843 6666"/></markers>';
</script>
</head>
<body>
<div style="border: 2px solid #3872ac;" id="map"></div>
<div id="side_bar"></div>
<p>Below are the real Streetview URL's with the same HEADING values that are passed to the variable "NEWHEADING"</p>
<a href="https://www.google.com.mx/maps/@21.141406,-86.83339,3a,75y,15.26h,90t/data=!3m4!1e1!3m2!1scugaDFoU9Zhym3_IwhMKgQ!2e0!4m2!3m1!1s0x0:0xfde8520f397fad4b!6m1!1e1">McDonalds</a>
<BR>
<a href="https://www.google.com/maps/@21.161016,-86.850647,3a,75y,233.56h,90t/data=!3m4!1e1!3m2!1sjODIp985qSnPK1noHruiCw!2e0!4m2!3m1!1s0x0:0xc90acf0749a704b!6m1!1e1">Caesars Pizza</a>
<BR>
<a href="https://www.google.com.mx/maps/@21.113087,-86.838704,3a,75y,320.13h,96.48t/data=!3m4!1e1!3m2!1sZWlO1UlMwAuqAL0zEYY_zQ!2e0!6m1!1e1">Vips</a>
</body>
</html>
<强>更新强>
3年后使用In [15]:
df['NEW_DATE'] = df['ACC_DATE'].apply(lambda x: x - pd.DateOffset(years=1))
df
Out[15]:
ACC_DATE NEW_DATE
index
538 2006-04-07 2005-04-07
550 2006-04-12 2005-04-12
查看此问题是不必要的,您可以这样做:
apply
这是一个矢量化操作
答案 1 :(得分:9)
您可以使用pd.Timedelta:
df["NEW_DATE"] = df["ACC_DATE"] - pd.Timedelta(days=365)
或替换:
df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x.replace(year=x.year - 1))
但两者都不会闰年,所以你可以使用dateutil.relativedelta
:
from dateutil.relativedelta import relativedelta
df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x - relativedelta(years=1))
答案 2 :(得分:8)
使用DateOffset:
df["NEW_DATE"] = df["ACC_DATE"] - pd.offsets.DateOffset(years=1)
print (df)
ACC_DATE NEW_DATE
index
538 2006-04-07 2005-04-07
550 2006-04-12 2005-04-12
答案 3 :(得分:0)
如果具有pd.Timestamp
对象而不是列,
pd.DateOffset(years=n)
并不理想,因为它会产生:UserWarning:丢弃非零纳秒转换
pd.Timedelta()
不接受年份。在这种情况下唯一适用于我的方法是pd.Timestamp.replace
:
t = pd.Timestamp.now()
t = t.replace(year=t.year - n)
answer by Padriac中已暗示了这一点,但需要进一步说明。